Appearance
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 , 怎么办? 这个时候需要使用 数组指针。