今天还是以课本上的例子为主。
有一个班,3个学生各学四门课,计算总平均分及第n个学生的成绩。
先定义一个计算平均值得函数,average。
<span style="font-size:14px;">void average(float *p,int n)
{
float sum=0,aver;
float *end=p+n-1; //当n=12时,end的值是p+11,指向最后一个元素
for(;p<=end;p++)sum+=*p;
aver=sum/n;
printf("%.2f\n",aver);
}</span>
这个就很简单了。
然后在定义一查找的函数,search。
<span style="font-size:14px;">void search(float (*p)[4],int n)
{
int i=0;
printf("the NO.%d 's number is:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",*(*(p+n)+i)); //输出n行的每个元素
}
</span>
这些都十分简单。但是易混淆的在主函数传递参数时。
<span style="font-size:14px;">int main()
{
void average(float *p,int n); //形参为指向数组首地址的指针
void search(float (*p)[4],int n); //形参为指向一维数组的指针
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
average(*score,12); //传递的是score[0][0]
search(score,2); //传递的是score[0]
return 0;
}</span>
这里要注意*p和(*p)[4]的不同,*p是指指向数组首地址的指针,即使指向score[0][0],此时p+1是指score[0][1]指向下一个元素。
而(*p) [4]是指向一维数组首地址的指针,即指向score[0],此时p+1是指score[1]指向下一维元素首地址。
而且,(*p)[4]和*p[4]是不同的。*p[4]是指针数组。
所以average通过*score的传递,可以通过不断的加一来得到所有元素的值。
而search通过score和n,求得第n行元素的值。
全部源代码在下:
<span style="font-size:14px;">#include<stdio.h>
int main()
{
void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
average(*score,12);
search(score,2);
return 0;
}
void average(float *p,int n)
{
float sum=0,aver;
float *end=p+n-1;
for(;p<=end;p++)sum+=*p;
aver=sum/n;
printf("%.2f\n",aver);
}
void search(float (*p)[4],int n)
{
int i=0;
printf("the NO.%d 's number is:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",*(*(p+n)+i));
}
</span>