指针数组VS数组指针:本质区别解析
指针数组与数组指针的区别
指针数组和数组指针是C/C++中容易混淆的概念,二者在声明方式、用途和内存结构上有本质区别。
指针数组(Array of Pointers)
由指针元素构成的数组,每个元素都是指向某种数据类型的指针。声明形式为:
int *arr[10]; // 包含10个int型指针的数组- 内存中连续存储多个指针变量
- 每个指针可以指向不同内存区域
- 典型应用:字符串数组(
char *str_array[])
数组指针(Pointer to Array)
指向整个数组的指针,能够指向特定大小的数组。声明形式为:
int (*ptr)[10]; // 指向包含10个int元素的数组的指针- 存储的是整个数组的首地址
- 指针算术运算以整个数组为单位
- 典型应用:多维数组处理
内存结构对比
指针数组示例: +------+------+------+ | ptr0 | ptr1 | ptr2 | 每个格子存储独立的内存地址 +------+------+------+ 数组指针示例: +---------------------+ | 指向连续数组的基地址 | +---------------------+典型使用场景
指针数组的用法
char *days[] = {"Mon","Tue","Wed"}; for(int i=0; i<3; i++) printf("%s\n", days[i]);数组指针的用法
int matrix[3][4]; int (*ptr)[4] = matrix; printf("%d", ptr[1][2]); // 访问第二行第三列类型系统差异
- 指针数组的类型是"元素指针类型的一维数组"
- 数组指针的类型是"指向特定维度数组的指针"
运算差异
对指针数组进行+1操作移动一个指针大小的距离,而对数组指针进行+1操作会跳过整个数组的长度。例如:
int arr[2][3]; int (*p)[3] = arr; p++; // 跳过头3个int,指向arr[1][0]理解这两个概念的关键在于运算符优先级:[]的优先级高于*,因此int *a[]是指针数组,而int (*a)[]是数组指针。
