c语言中,指向一维数组的指针变量有什么用呢?

rt,如程序:
#include <stdio.h>
void main()
{
void search(float (*p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
search(score,2);
}

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));
}

中,指针变量(形参)p 传递的值为 score ,即 &score [0], 所以 *p 所指向 score[0], 即 &score [0][0] ,我是这样理解的,觉得 (*p)[4]中的 [4] 可以省略,但调试程序时却报错,这是为何?

对于一维数组来说,p是存储数组的地址,*(p+n)为该地址第n个位置的数值。对于二维数组来说,*(p+i)指向第i组的存储地址,而*(*(p+i)+j)才是存储地址中第i组第j位的值。
在定义二维数组的时候,调试中,我们可以发现,每组数据的地址不是连续的,所以需要用指针数组来分别指向,当你把*P[4]的[4]去掉,指针就会出错就会发生错误。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-16
float (*p)[4]表示p是一个指针变量,指向4个实型元素的一维数组, p+1则p要移动4*4个字节。 如果去掉[4], 即float *p, 它表示指向实型变量的指针,p+1则p只移动4个字节。它们所指向的对象不同。
第2个回答  2019-08-16
省掉〔4〕,*p虽然指向了数组score首地址,但这样的话,输出语句printf("%5.2f
",*(*(p+n)+i));无法指向数组的第二行,指针p是一普通地址变量,它只能进行简单的移位*(p+n),而不能实现*(*(p+n)+i)).这就是报错的原因。。。
第3个回答  2010-10-11
*p 表示 p是指针
(*p)[4]表示p是指向指针的指针
虽然值是一样的,但是不同的类型本回答被提问者和网友采纳
相似回答