2的值是多少。哈哈,好吧,让我们来一点点分析。
从括号最里面开始:
p1是一个指针,他的值是total_count的地址;
&p1是一个地址,即指针p1的地址,我们用刚才的小技巧来看看,即地址p1地址,即指针p1的指针。
*(&p1)是一个值,这个值是&p1表示的地址所在内存的值实际上就是p1的值,&对p1进行了一次引用操作,*对其再解引用,实际上没有变化。此时*(&p1)的值为total_count的地址。
*(*(&p1))为total_count的值,也就是542.
到此,该表达式的分析结束,不过在实际编程中,没有人会用如此复杂的表达式进行编码。
4.指针的指针
指针的指针,即地址的地址。第一个地址是狭义上的地址,该地址实际上已经被“值”化,第二个地址是我们传统意义上的地址。这句话理解起来有些困难,我们先来看看下面的表达式;
int *p1 = &total_count;
int **p2 = &p1;
第一个表达式的意义我们已经清楚了,我们申请了一个指针变量,或者说是地址变量,它保存的是total_count的地址。
第二个表达式我们来一步步分析,p1是一个指针,即一个地址,&为地址符,加起来就是地址的地址,或者说指针的指针。而int **p2 我们可以这样理解 int *X,我们定义了一个指针变量X ,X为*p2,即X也是一个指针变量,加起来的意思就是我们申请了一个p2指针变量,这个指针变量指向的也是一个指针变量。
同理: int ***p3 = &p2;
int ****p4 = &p3;
......都是成立的表达式,不过在实际编码中,遇到的最多情况是指针和指针的指针这两种情况。
摘自 Kernel & UI