在C语言里,指针数组和数组指针虽然只差两个字,但代表的数据结构截然不同。指针数组是一个数组,里面存的是地址;数组指针是一个指针,它指向一段连续的内存块也就是整个数组。混淆二者常导致编译警告或运行时错误。

声明语法辨析
由于运算符优先级中[]高于*,在声明时要靠括号来改变结合顺序。
指针数组的声明
下面代码声明了一个长度为4的数组,每个元素都是int*类型指针:
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3, d = 4;
// 指针数组:arr是数组,元素为int*
int* arr[4] = {&a, &b, &c, &d};
for (int i = 0; i < 4; i++) {
printf("arr[%d] = %dn", i, *arr[i]);
}
return 0;
}
数组指针的声明
下面代码声明了一个指针,它指向含有4个int的数组:
#include <stdio.h>
int main() {
int data[4] = {10, 20, 30, 40};
// 数组指针:p是指针,指向int[4]
int (*p)[4] = &data;
for (int i = 0; i < 4; i++) {
printf("p[%d] = %dn", i, (*p)[i]);
}
return 0;
}
实际应用差异
指针数组的常见用途
指针数组适合管理一组字符串或对象地址,例如命令行参数char* argv[]就是典型的指针数组。
- 存储多个字符串首地址,节省拷贝开销
- 作为对象指针集合,方便批量释放或遍历
数组指针的常见用途
数组指针常用于二维数组函数传参,保证行维度信息不丢失。
| 场景 | 推荐类型 |
|---|---|
| 字符串列表 | 指针数组 |
| 矩阵行指针 | 数组指针 |
易错点提醒
若写成int* p[4]会被解析为指针数组;只有int (*p)[4]才是数组指针。在函数参数中,int p[][4]与int (*p)[4]等价,但后者语义更清晰。
记住:看变量名先与谁结合。和[]先结合就是数组,和*先结合就是指针。
小结
指针数组与数组指针的核心区别在于本质是一个数组还是一个指针。掌握声明时的括号用法,并结合字符串管理与二维数组传参等场景练习,就能准确运用二者。
pointer_arrayarray_pointerC_language修改时间:2026-07-26 03:15:09