#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]
,特别是因为已经提到了所有比较。