2012-03-04 13 views
4

私たちは火曜日に私たちのCS中間研究を勉強しています。(C++メモリ管理)int x = 1234、int&y = x ...の場合、スタックのyのアドレスはどうなりますか?

void foo(int &x) 
{ 
x = 1000; 
} 

void bar(int *x) 
{ 
*x = 1000; 
} 

void foobar(int x) 
{ 
x = 1000; 
} 

int main() 
{ 
    int x = 1234; 
    int &y = x; 

    int *z = &x; 

    int array_1[5]; 
    int *array_2[5]; 

    array_1[0] = 10; 
    array_2[0] = (int*)10; 
    array_2[1] = &y; 

    array_2[2] = &x; 

    foo(x); 
    foo(y); 
    foo(*z); 

    bar(&x); 
    bar(&y); 
    bar(z); 

    foobar(x); 
    foobar(y); 
    foobar(*z); 

    return 0; 
} 

我々がしようとしている:

「はさらに、あなたのような、いくつかのコード与えられたメモリ図を描くことができる必要があります:」

私たちの教授は、次のような、オンラインいくつかの研究材料を入れて一度に1ステップずつ進んで、スタックに割り当てられているもの、ヒープに割り当てられているもの、それぞれの値は何かを確認します。 & yはxのアドレスを保持しているが、& Y = &のx ...ので、yのアドレスは何ですか:

私たちは理解していないのですか?同様に、スタックはyを保持する必要はありませんか?

+0

[参照のアドレスを見つける方法はありますか?](http://stackoverflow.com/questions/1950779/is-there-any-way-to-find-the-address-of) -a-reference)。 –

+1

あなたのクラスノートと教科書は、この問題について何を言いますか? –

+3

質問は正確な重複ではないと思いますが、@CarlNorumによってリンクされた質問に対する回答は、確かに関連性があり読解価値があります。 –

答えて

8

ショートストーリーはありません スプーン yです。したがって、yのスタックには何も割り当てられません。あなたのケースのyが参考になるからです。

参照は単なるエイリアスであり、アドレスはありません。言い換えれば、それはxと同じことですが、名前は異なっています。 C++プログラマとしてリファレンスを考えるべきです。実際、コンパイラは参照を実装するためにオブジェクトのアドレスを使用することがあります(参照渡し時など)。そしてその場合でさえ、それはレジスタ内にのみ記憶され、したがってメモリアドレスを有さないかもしれない。しかし、これらはあなたが知っておくべきではない実装の詳細です:私はあなたがこれをチェックアウトすることをお勧めしますC++ References FAQ

+5

+1です。 –

+0

うわー。悪い私。何らかの理由で、私はかなりの参考文献に割り当てられたポインタを持っていましたが、あなたが見ているコードをダンプするのはかなり正しいです。もっと考えてみると、アドレスで撮影するときにエイリアスする必要があるため、この方法が必要です。ダー。私の応答を削除しました。 :) – Joe

+0

参照は通常ポインタとして実装されています。これらのポインタはスタックに割り当てられます。私はこれが正しいとは思わない。本当のポイントは、存在していてもこのポインタのアドレスを取得する方法がないということです!私の答えを見てください。 – usr

3

yは、オブジェクトでも関数でもないため、アドレスはありません。変数xへの参照です。つまり、yを使用するたびに、xを使用した場合と同じです。これは、yxへのポインタを保持することを全く必要としないことに注意してください。

ファンクションmainでは、生成された実行可能ファイルにはyが存在しない可能性があります。コンパイラは、のように、yのすべての使用を自明に置き換えることができます。それはの範囲外のオブジェクトを参照しなければならないため、基準となるxを、(実際に生成された実行に存在し、完全にインライン化されていないと仮定すると、再び、)あなたの関数bar

は、どこかに存在する必要はありません関数。そのような参照は通常ポインタとして実装されますが、実装者は参照を実装することは自由ですが、適合が最もよく見えます。

1

「単なる別の名前」と考えてください。言い換えれば、 "y"は "x"の別の名前なので、アドレスはありません。

0

intについて&y = x;アセンブリ(-Sでコンパイルされたもの)を見ると、多くの場合、xのアドレスはローカルスタック上の場所であることがわかります。したがって、スタックアドレスをyのアドレスと見なすことができます。

関連する問題