如果我们在“纸”上画出你的数组,它会是这样的
+-------------+-------------+--------------+------- ------+-------------+--------------+-------------+- ------------+-------------+
| 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],尤其是因为已经提到了所有部分。