当前位置:天才代写 > tutorial > C语言/C++ 教程 > 指针与数组(三)

指针与数组(三)

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:582

由于C措施的函数挪用是回收传值挪用,即实际参数与形式参数相结适时,实参将值传给形式参数,所以当我们操作函数来处理惩罚数组时,假如需要对数组在子措施中修改,只能通报数组的地点,举办传地点的挪用,在内存沟通的地点区间举办数据的修改。

在实际的应用中,假如需要操作子措施对数组举办处理惩罚,函数的挪用操作指向数组(一维或多维)的指针作参数,无论是实参照旧形参共有下面四种环境:

指针与数组(三)

我们知道,二维数组在内存中是按行存放,假定我们界说二维数组和指针如下:
int a[3][4],* p = a [ 0 ] ;
则指针p就指向二维数组。其在内存的存放环境如图6 – 11所示。

指针与数组(三)

从上述存放环境来看,若把二维数组的首地点通报给指针p,则映射进程如图6 – 11
所示。我们只要找到用p所暗示的一维数组中最大的元素及下标,就可转换为在二维数组中的
队列数。
# include<stdio.h>
m a i n ( )
{
int a[3][4],*ptr,i,j,max,maxi,maxj;
/ * m a x 是数组的最大, m a x i 是最大元素地址行, m a x j 是最大元素地址列* /
f o r ( i = 0 ; i < 3 ; i + + )
f o r ( j = 0 ; j < 4 ; j + + )
s c a n f ( " % d " , & a [ i ] [ j ] ) ;
p t r = a [ 0 ] ; / * 将二维数组的首地点通报给指针变量* /
m a x _ a r r ( p t r , & m a x , & m a x i , 1 2 ) ;
m a x j = m a x i % 4 ; / * 每行有四个元素,求该元素地址列* /
m a x i = m a x i / 4 ; / * 求该元素地址行* /
printf("max=%d,maxi=%d,maxj=%d",max,maxi,maxj);
}
int max_arr(b,p1,p2,n)
int *b,*p1,*p2,n;
/ * b 指向二维数组的指针, p 1指向最大值,p 2 指向最大值在一维数组中的位置, * /
/ * n 是数组的巨细* /
{
int i;
*p1=b[0]; *p1=0;
f o r ( i = 1 ; i < n ; i + + ) / * 找最大* /
if (b[i]>*p1) {*p1=b[i]; *p2=i;}
}
运行措施:

指针与数组(三)

6.4.4 指针与字符数组
在前面的课程中,我们用过了字符数组,即通过数组名来暗示字符串,数组名就是数组的首地点,是字符串的起始地点。下面的例子用于简朴字符串的输入和输出。
#include<stdio.h>
main()
{
char str[20];
gets(str);
printf("%s\n",str);
}

指针与数组(三)

此刻,我们将字符数组的名赋予一个指向字符范例的指针变量,让字符范例指针指向字
符串在内存的首地点,对字符串的暗示就可以用指针实现。其界说的要领为:charstr[20],
*P=str;这样一来,字符串str就可以用指针变量P来暗示了。
#include<stdio.h>
main()
{
char str[20],*p=str;/*p=str则暗示将字符数组的首地点通报给指针变量p*/
gets(str);
printf("%s\n",p);
}
RUN
good morning!
goodmorning!
需要说明的是,字符数组与字符串是有区此外,字符串是字符数组的一种非凡形式,存储时以“\0”竣事,所以,存放字符串的字符数组其长度应比字符串大1。对付存放字符的字符数组,若未加“\0”竣事符号,只能按逐个字符输入输出。
[例6-18]字符数组的正确利用要领。
#include<stdio.h>
main()
{
charstr[10],*p=str;
int i;
scanf("%s",str);/*输入的字符串长度高出10*/
for(i=0;i<10;i++)
printf("%c",*p++);/*正确输出*/
printf("\n");
p=str;
printf("%s",p);/*字符数组无’\0’符号,输出堕落*/
puts(str);/*字符数组无’\0’符号,输出堕落*/
}
对上述措施中字符数组以字符串形式输出,若无“\0”符号,则找不到竣事符号,输出出
错。
[例6-19]用指向字符串的指针变量处理惩罚两个字符串的复制。
字符串的复制要留意的是:若将串1复制到串2,必然要担保串2的长度大于或便是串1。
#include<stdio.h>
main()
{
char str1[30],str2[20],*ptr1=str1,*ptr2=str2;
printf("inputstr1:");
gets(str1);/*输入str1*/
printf("inputstr2:");
gets(str2);/*输入str2*/
printf("str1————str2\n");
printf("%s…….%s\n",ptr1,ptr2);
while(*ptr2)*ptr1++=*ptr2++;/*字符串复制*/
*ptr1=’\0′;/*写入串的竣事符号*/
printf("str1————str2\n");
printf("%s…….%s\n",str1,str2);
}
在措施的说明部门,界说的字符指针指向字符串。语句while(*ptr2)*ptr1++=*ptr2++;先测试表达式的值,若指针指向的字符是“\0”,该字符的ASCII码值为0,表达式的值为假,轮回竣事,表达式的值非零,则执行轮回*ptr1++=*ptr2++。语句*ptr1++凭据运算优先级别,先算*ptr1,再算ptr1++。

指针与数组(三)

#p#分页标题#e#

此刻,我们修改措施中语句printf("%s…….%s\n",str1,str2)为printf("%s…….%s\n",ptr1,ptr2);
会呈现什么功效呢?请思考。
[例6-20]用指向字符串的指针变量处理惩罚两个字符串的归并。
#include<stdio.h>
main()
{
char str1[50],str2[20],*ptr1=str1,*ptr2=str2;
printf("inputstr1:");
gets(str1);
printf("inputstr2:");
gets(str2);
printf("str1————str2\n");
printf("%s…….%s\n",ptr1,ptr2);
while(*ptr1)ptr1++;/*移动指针到串尾*/
while(*ptr2)*ptr1++=*ptr2++;串/*毗连*/
*ptr1=’\0′;/*写入串的竣事符号*/
ptr1=str1;ptr2=str2;
printf("str1——————str2\n");
printf("%s…….%s\n",ptr1,ptr2);
}

指针与数组(三)

需要留意的是,串复制时,串1的长度应大于便是串2;串通接时,串1的长度应大于便是串1与串2的长度之和。

 

    关键字:

天才代写-代写联系方式