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

有3个同学,各学4门课程,输出第n个同学的成绩。错误的程序是这样的:#include<stdio.h>voidmain(){voidsearch(float*p,intn... 有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 呢?谢谢解答!
展开
 我来答
guichengliu
推荐于2017-09-23 · TA获得超过1071个赞
知道小有建树答主
回答量:204
采纳率:100%
帮助的人:82.3万
展开全部
一、你的 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");
}
libinhao1111
2011-01-18 · TA获得超过1013个赞
知道小有建树答主
回答量:425
采纳率:0%
帮助的人:552万
展开全部
既然score是一个二位数组,要想传参数,肯定要使用相应等级的指针(二位指针,数组指针,指针数组),总之不能使用一维数组啊float (*p)[4] 和float ** p是一个等级,所以可以的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jackfunhunter
2011-01-19
知道答主
回答量:12
采纳率:0%
帮助的人:4.4万
展开全部
我帮修改了一下,你自己对比一下吧!在我的电脑上运行成功,不知道是不是你预想的结果,我想应该也是。
我觉得指针是个很好玩的东西,好好玩吧
#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");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
迎风摇摆的树叶
2011-01-18 · TA获得超过785个赞
知道小有建树答主
回答量:400
采纳率:50%
帮助的人:230万
展开全部
首先要搞清楚 *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); 对于指针的指针类型,同样原封不动。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式