C语言问题,请问二维数组的函数参数是怎么传递的?

C语言问题,请问二维数组的函数参数是怎么传递的?,第1张

数组为参数时会退化为一个二级指针传递,如图,可以将函数头部写成
void shuchu(int array_num);
在函数中调用时,直接传递数组名就可以了,数组名可以视为数组的“头指针”,可以用这个指针进行一系列的相关 *** 作,如图,可以按如下方式调用
shuchu(a);
另外,一个建议:不要在传参时忽略数组的长度,最好显式的以参数的形式传递给函数
或者,在数组中做标志,在函数中使用时可以根据标志自行分出维度
,不满意请追问

二维数组就是数组的数组,二维数组即数组的元素是一维数组的数组。那么我们要用指针指向二维数组,就是要定义一个指向数组的指针了。例如:

char str[3][10]; //定义了一个char型的二维数组
char (pstr)[10]; //定义了一个指向char型的数组指针
pstr=str;  //指针指向二维数组str

下面用pstr这个指针对二维数组进行赋值 *** 作

int i;
for(i=0;i<3;i++)
    scanf("%s",(p+i));  //(p+i)等价于str[i]

一、你的 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<stdioh>
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("%52f",((p+n)+i));
}
printf("\n");
}

正如楼下所言 int p ,定义的p是一个指向int型的指针
int (p)[10]是一个指向数组的指针 数组长度为10
假如定义成 deal(int p),传参数时要加强制类型转换: deal((int)a);
并且使用p时不能用下标,p[2][3]是错误的,因为不知道p指向的int型的长度,无法编译成(p+210+3)
必须自己写成(p+210+3)来调用
假如定义成 deal(int (p)[10])就不一样了,编译器就能知道p是一个指向长度为10的数组的指针
那么p[2][3]就能编译成(p+210+3)了
总之,C语言是很灵活的,不同的定义方式配上不同的用法,都是能得到正确的结果的
不知道这么说楼主明白了没
同样的还有多维数组对多维指针的问题,楼主可以自己类推一下

a是指针,不过是行指针,p的基类型int,而 a 的基类型是一个包含4个整形元素的一类数组
int (p)[4] = a;这样定义p也会编译过去的,因为这时p的基类型也是一个包含4个整形元素的一类数组。
至于int p = a[0];编译正确,是因为a[0]也是指针,基类型也是int。

就按照你举的例子来说:
a[2][3]={0,1,2,3,4,5}
这时形成一个二维数组,元素是:
a[0][0]=0,物理地址&a[0][0]
a[0][1]=1,地址&a[0][0]+1
a[0][2]=2,地址&a[0][0]+2
a[1][0]=3,地址&a[0][0]+3
a[1][1]=4,地址&a[0][0]+4
a[1][2]=5,地址&a[0][0]+5
分配存储空间时,系统把每3个数据作为一组,组名记a[0]、a[1],这两个值分别是每组第一个元素的地址,即a[0]=&a[0][0],a[1]=&a[1][0]。
所以:
a指向数组首元素的地址,a=&a[0][0];
a[0]代表第一组首元素地址,当然,a[0]也指向数组首元素的地址,a[0]=&a[0][0];
a是对a取值,它取出的是a[0],当然=&a[0][0];
&a[0]指a[0]的地址,还是它自己,所以&a[0]=&a[0][0]。
所以,第一行个打印语句输出的5个内容都是一样的,所以,输出5个19ff0c。是a[0][0](元素0)的储存位置。
第二个打印语句输出的5个内容也是相同的,都是19ff18。它们是a[1][0](元素3)的存放位置,19ff0C+3×4=19ff0c+12=19ff0c+c=19ff18。
后面也是类似解释。
具体p1、p2、p3的使用,是前面定义了三个字符串,此处拿来使用。你可以直接把p1的内容"%x,%x,%x,%x,%x\n"拿来替换掉p1,就好理解了。
有什么问题请留言。

二维数组名a是一个指向指针的指针。也是一个指针数组名,它含3个元素,a[0]a[1],a[2]。虽然a存储的地址是该数组首元素的地址,但它指向的并不是一个变量,而是一个指针。应为a是一个指向指针的指针,它指向的是和自己存储的地址相同的指针,即a[0],a[0]是第一行一维数组的指针,可以指向具体变量。
这下明白了吧,(a+0)它不是变量,她是指针,a指向a[0],(a+0)就是a[0]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12726434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存