深入理解 C 语言数组指针与指针数组
在 C 语言学习过程中,最让初学者迷惑的两个概念莫过于:
- 数组指针
- 指针数组
它们虽然名字相似,但本质完全不同。下面来彻底搞清楚这两者。
1. 指针数组
定义:数组的每个元素都是指针。
int *pArr[5]; // 一个数组,有 5 个 int* 指针
char *strs[3] = {"hello", "world", "linux"};
特点:
| 项目 | 指针数组 |
|---|---|
| 本质 | 存储多个指针 |
| 常用场景 | 动态字符串表、命令行参数、结构体指针表 |
| 优点 | 灵活、可变、更省内存 |
比如字符串冒泡排序:
char *strs[5] = {"hello","world","how","are","you"};
char *tmp = NULL;
for(int j = 4; j > 0; j--) {
for(int i = 0; i < j; i++) {
if(strcmp(strs[i], strs[i+1]) > 0) {
tmp = strs[i];
strs[i] = strs[i+1];
strs[i+1] = tmp;
}
}
}
几行代码即可完成排序,不需要移动真正的字符串,只交换指针即可,非常高效。
2. 数组指针
定义:指向整个数组的一根指针。
int a[5] = {1,2,3,4,5};
int (*p)[5] = &a; // p 是一个指向含 5 个 int 的数组指针
特点:
| 项目 | 数组指针 |
|---|---|
| 本质 | 指向整个一维数组 |
| 步长 | 一次加 1,跨越一个整行(5 个 int) |
| 常用场景 | 二维数组传参 |
二维数组传参例子:
int showArray(int (*p)[3], int row)
{
for(int i=0;i<row;i++)
for(int j=0;j<3;j++)
printf("%d ", p[i][j]);
}
这是处理二维数组时最标准、最安全的写法。
3. 记忆技巧(非常实用)
| 写法 | 读法 | 本质 |
|---|---|---|
int *p[5] | p 是一个数组,里面存储 5 个 int* | 指针数组 |
int (*p)[5] | p 是一个指针,指向一个包含 5 个 int 的数组 | 数组指针 |
口诀:
[] 优先级比 * 高 → p[5] 是数组
*括号最优先 → (p)[5] 是指针
总结
| 名称 | 本质 | 场景 |
|---|---|---|
| 指针数组 | 存指针的数组 | 字符串表、回调表 |
| 数组指针 | 指向整个数组的指针 | 二维数组传参 |
理解这两个概念,是掌握 C 语言指针的关键一步。

被折叠的 条评论
为什么被折叠?



