cod*_*ram 0 c pointers pointer-arithmetic multidimensional-array implicit-conversion
我对二维数组的了解:
但这对我来说没有意义 A 值如何与 *A 相同,有人可以告诉我这是如何在内存中工作的,我知道这是正确的,但我无法向自己解释
该声明
在数组中,数组名称是指向第一个元素地址的指针
是错的。
对于任何数组,其符号本身将衰减为指向其第一个元素的指针。
所以对于你的数组A它将衰减到&A[0].
如果您取消引用该指针,就像 发生的情况一样*A,那么您就得到了*(&A[0])。这与 plain 相同A[0]。
由于您的数组A是数组的数组,因此A[0]是一个数组,它反过来也会衰减为指向其第一个元素的指针。所以A[0]会衰减到&A[0][0].
所以*A将与 相同&A[0][0]。
然而,不同指针的类型有很大不同。
以您的示例数组为例:
int A[3][4];
Run Code Online (Sandbox Code Playgroud)
然后&A[0]将是一个指向四个int值的数组的指针,或int (*)[4]。并且&A[0][0]将是一个指向单个值的指针int,或者int *。
现在为什么所有这些指针看起来都是相同的,这是因为它们都指向相同的位置,而该位置也恰好与数组本身位于同一位置(即,&A其类型为int (*)[3][4])。
如果我们“画”它,它会看起来像这样:
+---------+---------+---------+---------+--------- +---------+-----+ | 一个[0][0] | 一个[0][1] | 一个[0][2] | 一个[0][3] | A[1][0] | 一个[1][1] | ... | +---------+---------+---------+---------+--------- +---------+-----+ ^ | &A | &A[0] | &A[0][0]
正如您所看到的,所有三个指针都将指向同一位置,但如上所述,它们具有不同的类型。