(arr + 2)相当于*(arr + 2).怎么样?

dav*_*ave 9 c arrays pointers

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

#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)); 
}
Run Code Online (Sandbox Code Playgroud)

输出:

6487616
6487616
Run Code Online (Sandbox Code Playgroud)

我期待的输出*(arr + 2)3.它怎么样(arr + 2)

dbu*_*ush 14

2D数组实际上是一个数组数组.

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

详细介绍arr + 2,arr有类型int [3][2].当你向它添加一个整数值时,它会衰减到指向第一个成员的指针,因此arr衰减为type int (*)[2],并且arr + 2也有该类型,并指向包含的子数组{ 3, 4 }.

另请注意,指针应使用%p格式说明符打印,并且必须将指针转换为指针void *,否则将调用未定义的行为.在这种情况下,你"幸运"他们碰巧打印相同的东西.

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

*(*(arr + 2))
Run Code Online (Sandbox Code Playgroud)