#include<stdio.h>
int main()
{
double score[][4]={{23.3,43.1,54.4,65.4},{45.2,32.1,45.9,12.2},{45.8,65.9,74.8,65.3}};
double *search(double(*pointer)[4],int n);
double *p;
int i,m;
printf("第几个人?");
scanf("%d",&m);
printf("第%d个人的成绩是:\n",m);
p=search(score,m);
for(i=0;i<4;i++)
{
printf("%5.2f\t",*(p+i));//这里为什么不是*((*p)+i),*(p+i)不是地址吗
}
}
double *search(double(*pointer)[4],int n)
{
double *p;
p=*(pointer+n-1);
return p;
}
p+i,实质是指向p数组的第i个元素的指针,*(p+i)就是这个指针的内容
其实i就是个偏移量。理论上p是一个地址,p+i值为(p+i)*单个元素的字节长度
*(p)+i是取当前元素值加i 没有意义
p是double * 指针,p+i是p地址偏移i值后的地址,然后 * (p+i)就是取LexSaints p偏移i值后地址内存储的值
你写的 * (( * p)+i)不成立,*p是p地址的值,( * p)+i是值增加i,整体是个值,不是地址,所以再用 * 取地址是错误的