Re: [问题] 二维阵列指标表示方法

楼主: Dracarys (MayShowGunMore)   2022-02-04 22:03:22
※ 引述 《lllll12b56》 之铭言:
: 例如我宣告a[5][5]这个二维阵列
:
: 为什么a+2的值跟*(a+2)的值都是位置
:
: 还是同样的位置?
同位址不同type
https://godbolt.org/z/boP9s6ovG
: 我原本还以为*(a+2) = a[2][0]
:
: 结果自己试才知道要取a[2][0]要**(a+2)
下图STDIN是foo.cpp的Clang AST dump(C++模式parse出来的):
https://i.imgur.com/7f88QAS.png
a是一个array of 8 arrays of 7 ints
a + 2:
对应AST第6-9行。
a的type先由int[8][7] decay成int (*)[7],也就是a pointer to an array of 7 ints(A
ST第七行),而且根据[conv.array]指到a[0],也就是第一个array of 7 ints。之后进行p
ointer arithmetic(AST第六行),加2就是跳过整整两列(两个int[7])。
*(a + 2):
对应AST第10-15行,其中第12-15行就是上一个case。
第10行对int(*)[7](pointer to an array of 7
ints)dereference得到int[7](an array of 7
ints),如果是C还会再decay到int*。a有8个int[7],此expression得到的是a[2]这一个。
**(a + 2):
对应AST第16-23行,其中第18-23行为上一个case。
第17行int[7]先decay到int*,再来才第16行dereference int*得到int。a[2]有8个int,此
expr得到的是a[2][0]。
楼主: Dracarys (MayShowGunMore)   2022-02-04 22:06:00
作者: Lipraxde (Lipraxde)   2022-02-04 22:52:00
喔喔~这么硬核!(◎_◎;)
作者: sarafciel (Cattuz)   2022-02-08 13:18:00
作者: lllll12b56 (saiwagon)   2022-02-14 20:14:00
感谢

Links booklink

Contact Us: admin [ a t ] ucptt.com