2012-01-20 63 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 **** ..)。我有一个大脑放屁,并认为这就是上面的代码在做什么,我的不好。 –