指向数组指针问题

来源:百度知道 编辑:UC知道 时间:2024/05/12 01:57:41
有一个班,3个学生,各学4门课,计算总平均分和第3个学生的成绩。
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);
}

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("%6.2f",*(*(p+n)+i));
}

/*此行问题*/中标出来的,float (*p)[4]为什么一定要这样声明4个指针才可以执行,而改成了float *p声明一个指针为什么不行?不是都是传score地址过去吗?

float (*p)[4];
p指向的是4个float构成的数组.

这里不能改为float* p, 因为search函数内有
*(*(p+n)+i))
这个表达式相当于
p[n][i]
这个表达式的意思是:
从p指向的位置开始, 往后偏移, 寻找第 (n*4+i)个float数. 而这正好与score数组的排放规律相同.

为什么是n*4+i而不是 n*5+i或其他, 就是因为p指向的是4个float构成的一维数组.

float (*p)[4]声明是数组指针,float *p声明是指针 不是一回事

float (*p)[4]不是 4 个指针,而是表示 p 指向的是含有 4 个元素的一维数组,看下面的例子:

float (*p)[4];
float* q;

p++; /* p移动了4个字节 */
q++; /* q移动了1个字节 */


void search(float *p,int n);

也可以的,不过改了形参类型,就需要改实参的类型和函数的实现