2012-01-20 4 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が必要として彼には意味がありません
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 

= & VP。私はここで何が起こっているのか分からないと言うのは恥ずかしいです。ここで何が起こっていますか?あなたは、コード

vp = &vp; 

でこのラインを持っている場合は

答えて

7

はそれがvp == &vp ...最初の繰り返しで

が、それはあなた(と彼は)期待どおりであることは驚きではありません。このコード一度

+0

Hmn、私はvpに衰弱していませんでしたか?なぜそれはprintfでそうしないのですか? –

+0

@ KimSun-wu:それは腐敗しません。 –

+0

'&vp'は' vp'に崩壊しません。その割り当ては、 'vp'のアドレスを' vp'( 'vp'に属するRAMセル)に格納します。したがって、アドレス '0xbfd29bf4'には値' 0xbfd29bf4'があります。 –

1

が実行された:

vp = &vp; 

ポインタ変数が今実際に自身のアドレスを格納します。これが唯一の最初のループ反復の後に起こることに注意してください - 最初のライン出力は

vp: 0xbfd29bf8, &vp: 0xbfd29bf4 

であり、割り当ては上記まだ行われていないため、値がまだ同じではありません。

1

これはvpとして理解できません!= & vp。

あなたはその割り当てを行った後ではどうでしょうか?

役立つ場合は、すべての変数がメモリ内の番号付きの場所を占めていると考え、その番号の付いたメモリの場所の1つを保持するポインタを考えてみてください。 voidポインターが、自分自身の位置を識別する値を格納できないのはなぜですか?

+0

彼が実際に求めていたことは、元のポインタへのポインタを再帰的に得ることができるかどうかということでした(つまり、void **** ..)。私は脳のおならを持っていて、それが上記のコードがやっていたことだと思っていました。 –