2015-10-06 64 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 
相關問題