在二维数组A[m][n]中,A的值如何与*A相同?

cod*_*ram 0 c pointers pointer-arithmetic multidimensional-array implicit-conversion

我对二维数组的了解:

  1. 在数组中,数组名称是指向第一个元素地址的指针
  2. 这里我们可以将 A 视为数组的数组,因此 A 将指向第 0 个一维数组
  3. 所以 A+i 会指向 A 的第 i 个元素
  4. *(A+i) 将指向 A 的第 i 个元素的第一个元素
  5. 那么在 2D 数组中 A+i 地址值应该与 *(A+i) 相同

但这对我来说没有意义 A 值如何与 *A 相同,有人可以告诉我这是如何在内存中工作的,我知道这是正确的,但我无法向自己解释

Som*_*ude 5

该声明

在数组中,数组名称是指向第一个元素地址的指针

错的

对于任何数组,其符号本身将衰减为指向其第一个元素的指针。

所以对于你的数组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]

正如您所看到的,所有三个指针都将指向同一位置,但如上所述,它们具有不同的类型。