2. C语言 多级指针
C语言中的 多级指针(multi-level pointers) 是理解 C 语言“指针真正的力量”的关键部分。
它是通向操作系统、嵌入式底层驱动、动态内存、链表、字符串数组 等核心技术的必经之路。
我们一步步把这块讲“透” —— 从 直觉图解 → 定义与语法 → 实例演示 → 常见错误 → 实战场景。
🧩 一、什么是多级指针?
简单来说:
多级指针就是 “指向指针的指针”。
换句话说:
- 一级指针 → 指向一个普通变量;
- 二级指针 → 指向一个一级指针;
- 三级指针 → 指向一个二级指针;
- 以此类推。
💡 1️⃣ 普通变量与一级指针
int a = 10; // 普通变量
int *p = &a; // p 是指针,存放 a 的地址
内存示意:
| 名称 | 内容(值) | 含义 |
|---|---|---|
a | 10 | 变量的值 |
p | 0x7ffee... | a 的地址 |
访问:
printf("%d\n", *p); // 输出10
💡 2️⃣ 二级指针:指向指针的指针
int **pp = &p;
pp存放的是 “p 的地址”*pp相当于 “p”**pp相当于 “a”
图解:
┌────────┐ ┌────────┐ ┌────────┐
│ pp │ ───→ │ p │ ───→ │ a │
│(地址p) │ │(地址a) │ │ 10 │
└────────┘ └────────┘ └────────┘
验证:
printf("%p\n", &a); // a的地址
printf("%p\n", p); // a的地址
printf("%p\n", *pp); // a的地址
printf("%d\n", **pp); // 10
💡 3️⃣ 三级指针(了解)
int ***ppp = &pp;
printf("%d\n", ***ppp);
层次:
ppp → pp → p → a
可读性非常差,除非你在写操作系统或驱动,否则尽量避免三级以上指针。
🧠 二、为什么需要多级指针?
📍 场景1:函数中修改指针的值
比如,我们希望函数修改一个指针的指向。
错误做法(修改失败):
void change(int *p) {int b = 20;p = &b; // 只改了形参副本,不影响主函数
}int main() {int a = 10;int *p = &a;change(p);printf("%d\n", *p); // 依然输出10
}
正确做法(用二级指针):
void change(int **pp) {int b = 20;*pp = &b; // 修改了指针本身
}int main() {int a = 