《C语言程序设计》课件——45指向数组的指针作函数参数.ppt
指向数组的指针作函数参数9.7.3指向数组的指针作函数参数
指向数组的指针变量也可以作为函数参数。
【例9.13】求二维数组a中全部元素的和(要求用指针作实参,数组名作形参)。
intarr_add(intarr[],intn)/*n为数组的元素个数*/
{inti,sum=0;
for(i=0;in;i++)sum=sum+arr[i];
return(sum);
}
main()
{inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int*p,t;
p=a[0];t=arr_add(p,12);
printf(t=%d\n,t);
}运行结果为:
t=144【例9.14】求一维数组中下标为奇数的所有元素之和。
intodd_add(int*pt,intn)
{inti,sum=0;
for(i=0;in;i=i+2,pt=pt+2)sum=sum+*pt;/*注意各表达式的意义*/
return(sum);
}
main()
{inta[10]={1,2,3,4,5,6,7,8,9,10},*p,t;
p=a[1];t=odd_add(p,10);/*使p指向a数组中的第一个奇数元素*/
printf(t=%d\n,t);
}
9.7.4用指针变量名加下标的形式访问数组可以用指针变量名加下标的形式来访问一个数组元素。例如,如果使p指向数组a,可以p[2]来访问a[2],这是因为系统对p[2]总是先转换成*(p+2),然后执行的。【例9.15】求一维数组所有元素的平均值(要求用指针下标法)。
#defineN10
floataaa(float*p,intn)
{floatsum=0.0;
inti;
for(i=0;in;i++)
sum=sum+p[i];
return(sum/n);
}
main()
{floatnum[N],a;
inti;
for(i=0;iN;i++)
scanf(“%f”,num[i]);
a=aaa(num,N);
printf(“aaa=%8.2f\n”,a);
}当i=1时,p[1]被解释成*(p+1),而p+1是num[1]的地址。【例9.16】有3个学生,每个学生学5门课,已知所有学生各门课的成绩,分别求每门课的平均成绩和每个学生的平均成绩。设各学生成绩如下:
课程1课程2课程3课程4课程5
学生1:10060708152
学生2:6271839298
学生3:9070506040
floats_pjcj(float(*p)[5])/*求学生平均成绩使用行指针*/
{floatsum=0;
inti;
for(i=0;i5;i++)
sum=sum+*(*p+i);
return(sum/5);
}floatk_pjcj(float*p)/*求各科目平均成绩使用列指针*/
{floatsum=0;
inti;
for(i=0;i3;i++,p=p+5)sum=sum+*p;
return(sum/3);
}
main()
{floats[3][5]={{100,60,70,81,52},
{62,71,83,92,98},
{90,70,50,60,40}};
inti;
for(i=0;i3;i++)
printf(学生平均成绩:%d:%6.2f\n,i+1,s_pjcj(s+i));
printf(\n);
for(i=0;i5;i++)
printf(科目平均成绩:%d:%6.2f\n,i+1,k_pjcj(s[0]+i));
}用数组名作函数参数是因为数组名代表数组的起始地址,用数组名作参数传递的是地址(将数组起始地址传递给被调用函数的形参)。既然地址可以作为参数传递,那么指向数组的指针变量当然也可以作为函数参数。分析:
(1)函数中p为指向整型数组的指针变量,它的值必须为二维数组的列地址a[0]或a[0][0],指向a数组的第一个元素。
(2)在调用a