#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]
,特别是因为所有部分都已经提到了。
关于c - 二维数组C++指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52034378/