二维数组指针含义*(p+i)

#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,整体是个值,不是地址,所以再用 * 取地址是错误的