我写这篇文章是为了测试我对指针的了解:
int main (){
int seven = 7;
int* p = &seven;
int** pp = &p;
int*** ppp = &pp;
printf("%d %d %d %d\n", *ppp, &pp, &p, &seven);
}
然而,在输出中,我得到:
1363848032 1363848024 1363848032 1363848044
这对我来说不直观,因为*ppp == &p
我期待*ppp == &pp
。为什么会这样? &pp
是否遵循指向p
?
答案 0 :(得分:3)
我将尝试使用以下架构解释问题:
ppp pp p seven <---- variable names
+----+ +----+ +----+ +----+
| 30 | | 20 | | 10 | | 7 | <---- memory contents
+----+ +----+ +----+ +----+
40 30 20 10 <---- memory addresses
在上图中,方框表示存储变量的各个内存插槽。每个框下面的数字是该地方在内存中的地址。
现在指针实际上只是一个变量,其值是恰好是某个其他变量的内存地址的数字。
因此,当您说*ppp
时,您要求地址30
的变量值等于20
,即p
的地址。所以你得到*ppp == &p
和ppp == &pp
。
答案 1 :(得分:1)
int*** ppp = &pp;
那你为什么期望*ppp == &pp
? (注意额外的*
取消引用)
答案 2 :(得分:1)
你想做这样的事吗?
#include <stdio.h>
int main (){
int seven = 7;
int* p = &seven;
int** pp = &p;
int*** ppp = &pp;
printf("%d %d \n", *p, seven);
printf("%d %d \n", **pp, seven);
printf("%d %d \n", ***ppp, seven);
printf("%p %p \n", p, &seven);
printf("%p %p \n", pp, &p);
printf("%p %p \n", ppp, &pp);
printf("%p %p \n", *ppp, pp);
}
$ ./ptr
7 7
7 7
7 7
0x7ffe4dce54b4 0x7ffe4dce54b4
0x7ffe4dce54a8 0x7ffe4dce54a8
0x7ffe4dce54a0 0x7ffe4dce54a0
0x7ffe4dce54a8 0x7ffe4dce54a8
答案 3 :(得分:1)
这是一个简单的方法:箱子和箱子号码。您可以将各种数字放入框中,包括框号。
在你的例子中:
7
放入一个框(变量seven
),其框号为&seven
。
然后您创建一个新框(变量p
)以保留7
的框号(&seven
),其框编号为{{1 }}
稍后你也会这样做,依此类推。
&p
包含ppp
的框编号,该编号用于保存pp
的框号,而该编号又创建为保留{{1} &#39;盒号。
p