2012-01-20 96 views
4

我正在和一位對低級語言不熟悉的人以及今天的手動內存管理進行交流,並盡我所能解釋指針。遞歸指針

然後,他想出了:

#include <stdio.h> 

int main() 
{ 
    int v = 0; 
    void* vp = &v; 
    int i = 0; 
    for(; i < 10; ++i) 
    { 
     printf("vp: %p, &vp: %p\n", vp, &vp); 
     vp = &vp; 
    } 
} 

的這是輸出:

vp: 0xbfd29bf8, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 
vp: 0xbfd29bf4, &vp: 0xbfd29bf4 

這是沒有意義的他作爲副總裁應該= &副總裁!我很慚愧地說,我不知道這裏發生了什麼事。所以,這裏發生了什麼?

回答

7

當你在代碼

vp = &vp; 

這一行,一點也不奇怪的是vp == &vp ...

在第一次迭代,這是因爲你(他)的期望。

+0

Hmn,我沒有意識到&vp腐爛vp?爲什麼不在printf中這樣做? –

+0

@ KimSun-wu:它不會衰退。 –

+0

'&vp'不衰減爲'vp'。該分配的作用是將'vp'的地址存儲在'vp'(屬於'vp'的RAM單元)中。所以,在地址0xbfd29bf4你有值0xbfd29bf4。 –

1

一旦運行此代碼:

vp = &vp; 

指針變量現在確實存儲了自身地址。請注意,這只是最初的循環迭代後會發生 - 第一行輸出

vp: 0xbfd29bf8, &vp: 0xbfd29bf4 

而且由於上述轉讓尚未完成值是不一樣的呢。

1

這對他來說沒有意義,因爲vp應該!= & vp。

爲什麼不應該在你完成這個任務之後呢?

如果有幫助,可以嘗試將每個變量都考慮爲佔用內存中編號的位置,並將指針指向保存其中一個編號的內存位置。爲什麼不應該有一個空指針能夠存儲一個恰好能夠識別自己位置的值?

+0

他實際上問的是他是否可以遞歸地指向原始指針(即void **** ..)。我有一個大腦放屁,並認爲這就是上面的代碼在做什麼,我的不好。 –