2015-10-06 73 views
0

我写这个测试上的指针我的知识:为什么这个程序有意想不到的指针值?

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的指针?

+3

总是使用'“%p”'格式说明符来打印指针地址!同样,从main函数返回一些东西(因为它必须返回'int'),从stdlib.h中返回'EXIT_SUCCESS',最后但并非最不重要的是,编写'int main(void)'或'int main (int argc,const char * argv [])' –

+1

Yessir,未来会做@PeterVaro –

回答

3

我会尝试使用下面的模式来解释这个问题:

ppp  pp  p seven  <---- variable names 
+----+ +----+ +----+ +----+ 
| 30 | | 20 | | 10 | | 7 |  <---- memory contents 
+----+ +----+ +----+ +----+ 
    40  30  20  10  <---- memory addresses 

在上面的图中方框代表个别内存插槽您的变量存储。每个方框下面的数字是该地点在内存中的地址。

现在指针实际上只是一个变量,其值是恰好是其他变量的内存地址的变量。 所以,当你说*ppp你问变量的地址30,这相当于20,这是p地址的值。所以你得到*ppp == &pppp == &pp

+0

不错,这说得很清楚,谢谢! –

1
int*** ppp = &pp; 

那么你为什么期望*ppp == &pp? (注意多余的*解除引用)

+0

不应该'ppp'的值是'pp'的地址吗?因此,当解引用时,'* ppp ==(pp的addr)'? –

+0

你不应该取消引用来获取某个东西的值....如果'ppp'有一个值,为了得到它,你写'ppp' .... –

+2

@ ylun.ca'ppp ==&pp',so '* ppp == *(&pp)' – Barmar

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 
1

有一个简单的方法来看这个:盒子和盒子的数字。您可以将各种数字放入框中,包括框号。

在您的例子:

7放入一个盒子(可变seven),其具有的&seven一个箱号。

然后创建一个新的框(可变p)持有7的箱号(&seven),这反过来有&p一个箱号。

后来你也这样做了,依此类推。

ppp持有pp的箱号,这是为了保持p“这又是为了保持seven的箱数S盒数。

*ppp = pp 
*pp = p 
*p = seven = 7 
相关问题