h-b-z-d-j-s-m 发表于 2022-11-12 17:35:09

形参实参

调用函数时,实参与形参的类型可以不一致,编译器能够自动转换    这句话对吗
int array   *(array+i*4+j)为什么表示 的不对

jackz007 发表于 2022-11-12 18:04:15

本帖最后由 jackz007 于 2022-11-12 19:04 编辑

       因为 array 是 int (*) 型的指针,也就是说,它是一个二级指针,每增减 1 的实际跨度是 4 个 int 元素,表达式 * (array + i * 4 + j) 实际上还是一个指针(一级指针),而不是一个数组元素。其实,array[ i ] 的正确表达是 *(*(array + i) + j)或者 * (* array + i * 4 + j)。

xiaotubie 发表于 2022-11-12 21:08:36

本帖最后由 xiaotubie 于 2022-11-12 21:42 编辑

前面作为形参相当于申明int (*array),后面那个表达式结果是int* 类型,所以类型不一致。array作为右值表达式使用,会转换为指向首元素的指针,你这里定义的二维数组,所以array指向二维中第一个子数组的指针,不是二级指针。

两手空空儿 发表于 2022-11-13 11:31:59

xiaotubie 发表于 2022-11-12 21:08
前面作为形参相当于申明int (*array),后面那个表达式结果是int* 类型,所以类型不一致。array作为右 ...

把二维数组名理解为二级指针才是正确的,数组名是一个指针,array是指向数组的指针,也就是二级指针
这里*array拿不到第一个元素的值,而是一个地址,**array才是第一个元素的值

homeskating 发表于 2022-11-13 11:56:01

二维数组拿值要双重解址也就是**,类型应该是要一致吧,要不然会报错,除非是可以隐形转化的像int转long也就是小转大

xiaotubie 发表于 2022-11-13 12:31:44

本帖最后由 xiaotubie 于 2022-11-13 12:46 编辑

两手空空儿 发表于 2022-11-13 11:31
把二维数组名理解为二级指针才是正确的,数组名是一个指针,array是指向数组的指针,也就是二级指针
这 ...

建议你看看c标准,或者咨询其他人,说是二级指针的,只能说c语言跟体育老师学的,完全不懂数组和指针。如果对此有疑问,你去知乎问下,保证被一群人喷的啥也不是。

两手空空儿 发表于 2022-11-14 20:28:55

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

我没学好,这不能怪老师~~~~
没看过C标准,我是说把二维数组名理解成二级指针,对于我来说,理解二维数组名这个东西过于抽象的概念,还没想到更好的方法,(二维数组的第一维放的是指针数组,第二维放的是普通数组,第二维的数组是连续存放的)
你是怎么理解二维数组名这个东西的呢,咱们讨论一下
它的值明明是第一个元素的地址,为什么*array却得不到想要的东西?

xiaotubie 发表于 2022-11-14 22:57:27

本帖最后由 xiaotubie 于 2022-11-14 23:04 编辑

C标准中,有句话:当数组(或数组名)参与到很多表达式中时会转换为首元素指针,某些表达式时数组不会发生转换,还代表原来的意思,数组。
看完上面的话,你就知道我为什么不说数组名是二级指针了。当然array这样去看,忘记中间的所有转换,那它确实像二级指针。
我的意思,单独看数组名,它确实不是二级指针,就是代表数组。譬如sizeof(array)输出的是数组的大小,而不是指针的大小。放到某个表达式中,可以理解为像二级指针。

xiaotubie 发表于 2022-11-14 23:04:23

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

看上条

两手空空儿 发表于 2022-11-14 23:14:59

好的
页: [1]
查看完整版本: 形参实参