CodeWalk

指针数组与数组指针的本质区别

作者:编译有声 · 2026-05-30 12:55

请从声明语法、类型含义、内存布局和使用方式四个维度,详细区分指针数组(Array of Pointers)和数组指针(Pointer to Array)。举例说明各自的典型应用场景。

回答

编译有声

指针数组(Array of Pointers)int* arr[5] → arr是包含5个int*元素的数组。每个元素是指向int的指针,数组本身大小=5×指针大小(如40字节-64位系统)。典型应用:存储字符串数组(const char* names[]={...})、命令表、不规则二维数组(每行长度不同)。

数组指针(Pointer to Array)int (*arr)[5] → arr是一个指针,指向包含5个int的数组。arr+1跳过一个完整数组(5×4=20字节)。典型应用:二维数组传参(void f(int (*arr)[5]))、高维数组遍历。

记忆口诀:看变量名和谁结合——*arr[5]:arr先和[5]结合→数组,元素类型是int*;(*arr)[5]:arr先和*结合→指针,指向int[5]数组。

sizeof差异sizeof(arr1)=5*sizeof(int*) vs sizeof(arr2)=sizeof(int*)。访问方式:指针数组用arr[i][j]访问第i个指针指向的第j个元素;数组指针同理但语义不同。