鱼C论坛

 找回密码
 立即注册
查看: 2942|回复: 9

形参实参

[复制链接]
发表于 2022-11-12 17:35:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
调用函数时,实参与形参的类型可以不一致,编译器能够自动转换    这句话对吗
int array[3][4]   *(array+i*4+j)为什么表示 的不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-12 18:04:15 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-12 19:04 编辑

       因为 array 是 int (*)[4] 型的指针,也就是说,它是一个二级指针,每增减 1 的实际跨度是 4 个 int 元素,表达式 * (array + i * 4 + j) 实际上还是一个指针(一级指针),而不是一个数组元素。其实,array[ i ][j] 的正确表达是 *(*(array + i) + j)  或者 * (* array + i * 4 + j)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-12 21:08:36 From FishC Mobile | 显示全部楼层
本帖最后由 xiaotubie 于 2022-11-12 21:42 编辑

前面作为形参相当于申明  int (*array)[4],后面那个表达式结果是int* 类型,所以类型不一致。array作为右值表达式使用,会转换为指向首元素的指针,你这里定义的二维数组,所以array指向二维中第一个子数组的指针,不是二级指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-13 11:31:59 | 显示全部楼层
xiaotubie 发表于 2022-11-12 21:08
前面作为形参相当于申明  int (*array)[4],后面那个表达式结果是int* 类型,所以类型不一致。array作为右 ...

把二维数组名理解为二级指针才是正确的,数组名是一个指针,array是指向数组的指针,也就是二级指针
这里*array拿不到第一个元素的值,而是一个地址,**array才是第一个元素的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-13 11:56:01 | 显示全部楼层
二维数组拿值要双重解址也就是**,类型应该是要一致吧,要不然会报错,除非是可以隐形转化的像int转long也就是小转大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-13 12:31:44 From FishC Mobile | 显示全部楼层
本帖最后由 xiaotubie 于 2022-11-13 12:46 编辑
两手空空儿 发表于 2022-11-13 11:31
把二维数组名理解为二级指针才是正确的,数组名是一个指针,array是指向数组的指针,也就是二级指针
这 ...


建议你看看c标准,或者咨询其他人,说是二级指针的,只能说c语言跟体育老师学的,完全不懂数组和指针。如果对此有疑问,你去知乎问下,保证被一群人喷的啥也不是。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-14 20:28:55 | 显示全部楼层
xiaotubie 发表于 2022-11-13 12:31
建议你看看c标准,或者咨询其他人,说是二级指针的,只能说c语言跟体育老师学的,完全不懂数组和指针。 ...

我没学好,这不能怪老师~~~~
没看过C标准,我是说把二维数组名理解成二级指针,对于我来说,理解二维数组名这个东西过于抽象的概念,还没想到更好的方法,(二维数组的第一维放的是指针数组,第二维放的是普通数组,第二维的数组是连续存放的)
你是怎么理解二维数组名这个东西的呢,咱们讨论一下
它的值明明是第一个元素的地址,为什么*array却得不到想要的东西?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-14 22:57:27 From FishC Mobile | 显示全部楼层
本帖最后由 xiaotubie 于 2022-11-14 23:04 编辑

C标准中,有句话:当数组(或数组名)参与到很多表达式中时会转换为首元素指针,某些表达式时数组不会发生转换,还代表原来的意思,数组。
看完上面的话,你就知道我为什么不说数组名是二级指针了。当然array[2][3]这样去看,忘记中间的所有转换,那它确实像二级指针。
我的意思,单独看数组名,它确实不是二级指针,就是代表数组。譬如sizeof(array)输出的是数组的大小,而不是指针的大小。放到某个表达式中,可以理解为像二级指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-14 23:04:23 From FishC Mobile | 显示全部楼层
两手空空儿 发表于 2022-11-14 20:28
我没学好,这不能怪老师~~~~
没看过C标准,我是说把二维数组名理解成二级指针,对于我来说,理解二维数 ...

看上条
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-14 23:14:59 | 显示全部楼层
好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 20:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表