7.5 二级指针
指针本身也是一个变量,也有自己的地址。指向指针的指针叫二级指针(pointer to pointer),写作 int **。
c
int data = 5;
int *p = &data; // 一级指针,指向 data
int **q = &p; // 二级指针,指向 p
printf("%d\n", data); // 5
printf("%d\n", *p); // 5
printf("%d\n", **q); // 5q 里保存的是 p 的地址。*q 就是 p,**q 再解引用一次得到 data。每多一个 *,就多“跟随”一次地址。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
让函数修改调用者的指针
二级指针最常见的用途,是让函数去修改调用者的“指针”。如果只传 int *,函数改的只是指针的副本;要改调用者的指针本身,就得传 int **。
c
void allocate(int **out) {
*out = malloc(sizeof(int));
**out = 7;
}
int main(void) {
int *q = NULL;
allocate(&q); // 现在 q 指向一块新内存
printf("%d\n", *q); // 7
free(q);
return 0;
}argv 也是二级指针
main(int argc, char **argv) 里的 argv 就是一个 char **:它指向一组字符串指针,每个 argv[i] 是一个字符串(命令行参数详见 6.3)。
正在加载本节练习...