C语言中用指向数组的指针作函数参数的一个问题

谭浩强老师C语言书上的一个程序
有一个班,3个学生,各学四门功课,计算平均分数以及第n个学生的成绩。
书上给的答案是
#include <stdio.h>
void 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);
printf("\n");
}
void average(float *p,int n)
{float *p_end;
float sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float(*p)[4],int n)
{int i;
printf("the score of No.%d are:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",*(*(p+n)+i));
}
TC3运行结果为
average=82.25
the score of No.2 are:
90.00 99.00 100.00 98.00
我把书上给的程序的第7行的average(*score,12);中的*去掉,变为average(score,12);TC3运行的结果和不去*是一样的,average仍为82.25
可书上在引出本节内容时说,使p指向一个包含m个元素的一维数组。这时,如果p先指向a[0](即p=&a[0]),则p+1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位。
我想不明白,书上前后说的好像是矛盾的,如果按前面说的,average应该等于(65+80+90)/3=78.3
请高手指点下为什么 小弟这里谢谢了 O(∩_∩)O~

printf("%x\n", score + 1);
printf("%x\n", *score + 1);
自己看看差多少

void average(float *p,int n)
这个函数参数的类型是float*
而score是float**类型,它赋值给p的时候发生了类型转换,转换成了float*
*score是float*类型,它们2个都指向第一个元素,所以效果就一样的咯。
float*指针加1,当然只偏移sizeof(float)字节
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-08-25

其实两者是等价的,它们都会将地址传送给*p,我在调试时发现p的值是一个地址!

相似回答