请教C语言一道指向二维数组指针的题,谢谢!

有3个同学,各学4门课程,输出第n个同学的成绩。
错误的程序是这样的:
#include<stdio.h>
void main()
{void search (float *p,int n);/*这里的 float *p 好像有问题*/
float score[3][4]={65,67,70,60,80,87,90,81,90,99,100,98};
search(score,2);
}

void search(float *p,int n));/*这里的 float *p 好像有问题*/
{int i;
printf("the score of No.%d are:\n",n);
for(i=0;i<4;i++)
printf("%5.2f",*(*(p+n)+i));
printf("\n");
}
编译的时候显示有1错误。
如果在上面标注处把 float *p 改成 float (*p)[4] 的话就正确了。
为什么不能用 float *p 呢?谢谢解答!

一、你的 float score 数组定义的是:一个3行、4列的二维浮点数组,数组的元素为浮点数。如果你换个格式书写就清晰了!
float score[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};
在调用的过程中,score 就是这个数组的首地址,指向的是浮点数组{65,67,70,60,}。score + 1 指向的是数组{80,87,90,81,}。
二、你的 float *p 定义的是:一个指向浮点数的指针。这个是一维的。
在调用的过程中,float 指向的是 xx。一个浮点数字。
两个的定义不同,所以参数传递过程中会出错。
三、你的 float (*p)[4] 定义的是:一个指向含有四个元素的浮点数组的指针。
在调用的过程中,float 指向的是{xxx,xx,xx,xx,},由四个浮点数组成的数组。
这时两个定义相同,所以参数传递过程中没有错误。
四、有个建议,你的程序书写格式不清晰,不利于你纠错和修改,应该尽量的清晰、明确,不建议使用简化方式定义参数。
作为一个软件工作者,应该尽量使程序流畅、格式清晰、易读,这是一个软件工作者最基本的职业素养。
格式化后,程序如下,会清晰很多:
#include<stdio.h>
void main()
{
void search (float (*p)[4],int n);/*这里的 float *p 好像有问题*/
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)/*这里的 float *p 好像有问题*/
{
int i;
printf("the score of No.%d are:\n",n);
for(i=0;i<4;i++)
{
printf("%5.2f",*(*(p+n)+i));
}
printf("\n");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-18
既然score是一个二位数组,要想传参数,肯定要使用相应等级的指针(二位指针,数组指针,指针数组),总之不能使用一维数组啊float (*p)[4] 和float ** p是一个等级,所以可以的
第2个回答  2011-01-19
我帮修改了一下,你自己对比一下吧!在我的电脑上运行成功,不知道是不是你预想的结果,我想应该也是。
我觉得指针是个很好玩的东西,好好玩吧
#include<stdio.h>

void search(float *p,int n); //函数的声明要放到main()函数的外面

void main()
{

float score[3][4] =
{
65,67,70,60,
80,87,90,81,
90,99,100,98
};

search( &score[3][4],2); //传入的参数要正确阿
}

void search(float *p,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); //这里你有个不合法的定义,我给你改过来了
printf("\n");
}
第3个回答  2011-01-18
首先要搞清楚 *p和 (*p)[4]分别是什么 在定义的时候float *p定义了一个1维指针。而score是一个二维数组。会出现格式不对应的情况。那为什么(*p)[4]为什么可以呢?根据运算符优先级,括号里面优先级高,所以这是一个数组指针。本质上是个指针,指针指向一个有4个元素的数组。那怎样和score联系起来就显然了,一开始他先指向score的第一行,该行有4个元素。然后可以指向下一行。表示二维数组除了这个方式,还有*p[4](指针数组),**p(指针的指针),p[3][4](原型)。在函数中的调用如下:
(1) char a[m][n] -- void func(char (*p)[]); 二维数组退化为数组的指针
(2) char *p[n] -- void func(char **p); 这个是一个指针数组,我们只需要取地址即可;
(3) char (*p)[n] -- void func(char (*p)[]); 这个本身就是一个数组指针,原封不动即可;
(4) char **p -- void func(char **p); 对于指针的指针类型,同样原封不动。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网