c - (arr + 2) 等同于 *(arr + 2) 。如何?

标签 c arrays pointers

我正在研究如何借助指针显示二维数组的元素。这是我试过的代码:

#include<stdio.h>  

int main(){

    int arr[3][2] = {  

    {7, 8},
    {6,3},
    {3,4}
    };

    printf("%u\n", (arr + 2));
    printf("%u\n", *(arr + 2)); 
}

输出:

6487616
6487616

我期望 *(arr + 2) 的输出为 3。它与 (arr + 2) 有何相同之处?

最佳答案

二维数组实际上是数组的数组。

表达式 arr + 2 的类型为 int (*)[2],而 *(arr + 2) 的类型为 整数 [2]。打印前者时,您有一个指针,以便打印指针的值。在后一种情况下,您有一个数组衰减到指向第一个元素的指针。所以 *(arr + 2) 衰减为 arr + 2,这与第一个表达式相同。

深入了解 arr + 2arr 的类型为 int [3][2]。当你向它添加一个整数值时,它会衰减为指向第一个成员的指针,因此 arr 会衰减为类型 int (*)[2],并且 arr + 2 也有那个类型,并指向包含 { 3, 4 } 的子数组。

另请注意,指针应使用 %p 格式说明符打印,并且指针必须转换为 void *,否则您将调用 undefined behavior .在这种情况下,您很“幸运”,因为他们碰巧打印了同样的东西。

要获得您期望的 3 的输出,您需要再取消引用一次:

*(*(arr + 2))

关于c - (arr + 2) 等同于 *(arr + 2) 。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52062706/

相关文章:

arrays - 声明一个常量数组

java - NullpointerException 数组和对象

javascript - 动态规划 : return all match data

c++ - 此方法是否评估空字符串?

c++ - 应用于变量名时 * 和 & 的含义是什么?

c - malloc() 成功但分配的内存少于预期

c - 为什么 readdir 在第一次调用目录后下次调用 readdir 时返回 null 和 I/O 错误

使用函数计算C中2个 double 的调和平均值

c - 从 ether_addr 获取源 MAC 地址

c++ - 指向对象及其析构函数的指针