本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第2章,第2.2节,作者 蔡明志,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.2 两颗星星:表示两把钥匙
指针的编程艺术(第二版)
接下来,讨论两个*的用法,这好比需要两把钥匙才能得到信箱内的信件,如范例twoPointer所示。
范例twoPointer
/* twoPointer.c */
#include <stdio.h>
#include <conio.h>
int main()
{
int x = 100;
int *p1 = &x;
int **p2 = &p1;
printf("变量定义如下: \n");
printf("int x = 100;\nint *p1 = &x;\nint **p2 = &p1;\n\n");
printf("&x=%p\n", &x);
printf("&p1=%p, p1=%p\n", &p1, p1);
printf("&p2=%p, p2=%p\n\n", &p2, p2);
printf("**p2=%d, *p1=%d\n", **p2, *p1);
getch();
return 0;
}
输出结果
其中
int *p1 = &x;
表示p1指针变量所存储的是x变量的地址,而
`
javascript
int **p2 = &p1;
这条语句的示意图,如下所示。
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/920b874c44a2761fc10071e73073a2de524cd385.png" >
</div>
表示p2指针变量需要通过两次的间接访问才能得到x的值,也就是p2需具备两把钥匙才能得到信箱内的信件。因为*p2表示第一次间接得到p1变量的数据,它里面存储的是x变量的地址,此时再加上一个*,就可得到x变量的值。
这个例子好比一个人使用第一把钥匙打开信箱p1,得到的信件的内容是另一个信箱x的地址;他再拿起第二把钥匙,打开信箱x,发现里面是100元。