Skip to content
On this page

C语言指针与二维数组


标签:clang/basic  
c
int arr[3][4] = {{1,2,3,4}, {5,6,7,8},{9,9,9,9}};
printf("arr[0]+1 = %p\n", arr[0]+1);           //偏移4字节 
printf("arr+1 = %p\n", arr+1);                //偏移16个字节

因为我们知道数组名基本上等同于一个指针[^1] , 所以 arr[3][4] 实际上是一个长度为 3 的指针数组, 每个指针指向对应行的数据的首地址 . 所以 arr + i 可以完成对矩形数组数据行的迭代 .

那么用一个指针指向 arr 可以吗 ?

c
int *p = arr;

首先其实已经类型不匹配了, 因为上面说过 arr 是一个指针数组[^2] , 编译器会提示警告 :

bash
test2.c:7:14: warning: initialization of ‘int * from incompatible pointer type ‘int (*)[4]’ [-Wincompatible-pointer-types]
    7 |     int *p = arr;
      |              ^~~

但编译还是会通过 , 实际上它被隐式转[^3]换到了 int * 类型 , 它指向的内容直接变为了 arr[0][0] 而不是预期的 arr[0] ( 虽然是同一个地址 , 但概念不一样 ). 如果对 p 进行偏移, 那么每次 +1 的偏移量为 int 的大小 4 字节, 而不是预期的 16 字节.

那么如果我们想用一个指针来指向 arr , 怎么办? 这个时候需要使用 数组指针。

Last updated: