c - 二维数组C++指针地址

标签 c pointers multidimensional-array indexing

#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/

相关文章:

php - 学习PHP之前必须先学习C/C++吗?

java - ODBC 与 JDBC 性能对比

c++ - 如何在 switch 语句中更改指针。错误 :invalid conversion from 'const char*' to 'char'

java - 如何更改 2d ArrayList 中某些 ArrayList 的大小?

c - Unix 域套接字客户端无法连接

c - 管道在c中是如何工作的?

c++ - 函数指针和回调

c++ - 使用指针对链表 C++ 进行排序

c++ - 在函数之间的堆上传递数组时导致此运行时错误的原因,c++

jquery - 使用 jQuery 验证插件验证多维数组