#include <stdio.h>
int main()

    { int arr2D[3][3];
    printf("%d\n",((arr2D==*arr2D) && (*arr2D==arr2D[0])));
    return o;
    }


这些值在* arr2D和arr2d处的存储方式是如何相同的,而arr2D是一个常数指针,它将存储第一个元素的地址,而arr2D表示存在于arr2D所指向的地址处的值?

最佳答案

如果我们在“纸”上画出您的数组,它将看起来像这样

+ ------------- + ------------- + ------------- ++ ------ ------ + ------------- + ------------- + ------------- +- ------------ + ------------- +
| arr2D [0] [0] | arr2D [0] [1] | arr2D [0] [2] | arr2D [1] [0] | arr2D [1] [1] | arr2D [1] [2] | arr2D [2] [0] | arr2D [2] [1] | arr2D [2] [2] |
+ ------------- + ------------- + ------------- ++ ------ ------ + ------------- + ------------- + ------------- +- ------------ + ------------- +


然后,您必须记住,数组自然会衰减到指向其第一个元素的指针。当需要指针时,这就是普通的arr2D&arr2D[0]相同。

现在,如果我们“重绘”数组,但仅针对arr2D[0](这与您的问题最相关),并使用一些可能的指针:

+ ------------- + ------------- + ------------- + ----- +
| arr2D [0] [0] | arr2D [0] [1] | arr2D [0] [2] | ... |
+ ------------- + ------------- + ------------- + ----- +
^
|
&arr2D [0]
|
&arr2D [0] [0]


由于我们知道arr2D&arr2D[0]相同,因此我们可以在表达式arr2D == *arr2D中进行替换。这使我们成为&arr2D[0] == *&arr2D[0]

取消引用*&的地址运算符相互抵消,因此我们有&arr2D[0] == arr2D[0]

现在继续……我们知道一个数组会衰减到指向其第一个元素的指针,并且我们知道arr2D[0]是一个数组。这意味着它将衰减到&arr2D[0][0],剩下表达式&arr2D[0] == &arr2D[0][0]。如图所示,这两个地址相同,这意味着比较是正确的。

重要说明:虽然&arr2D[0]&arr2D[0][0]可能都指向同一位置,但是它们的类型不同。 &arr2D[0]的类型为int (*)[3],而&arr2D[0][0]的类型为int *



掌握了以上信息后,应该很容易理解其他比较*arr2D == arr2D[0],特别是因为已经提到了所有比较。

09-25 23:12