指针也有自己的地址,因此另一个指针可以保存它的地址。int **q 表示 q 指向一个 int *;*q 得到 p,**q 再沿着 p 找到 data。
#include <stdio.h>
int main(void) {
int data = 5;
int *p = &data;
int **q = &p;
printf("%d\n", data);
printf("%d\n", *p);
printf("%d\n", **q);
return 0;
}知识测验
题目
表达式 *q 的类型是什么?
互动实验
沿地址链读取与修改
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
修改指针变量本身
把 int ** 传给函数后,函数不仅能修改最终整数,还能修改调用者的指针变量。调用时必须传入指针的地址,例如 redirect(&p, &other)。
void redirect(int **target, int *destination) {
*target = destination;
}知识测验
题目
执行 **q = 9 会修改哪个对象?
知识测验
题目
函数要改变调用者的 int * 变量 p,应接收什么?
动手练习
重定向一个指针
实现 choose_larger(int **selected, int *a, int *b),让 selected 指向较大的整数。用 4 和 9 测试,并通过 **selected 输出 9。
- 在 main 中让 p 最初指向 first。
- 函数接收 int **target 和新的 int * 地址。
- 通过 *target = replacement 修改调用者的 p,并验证 *p。