1

次のコードでは、 cplusplus.comの読み取りに基づいて、ポインターに関する基本的な理解をテストしようとしています。

#include <iostream>
using namespace std;

int main() {
    int foo, *bar, fubar;
    foo = 81;
    bar = &foo;
    fubar = *bar;
    cout << "the value of foo is " << foo << endl;
    cout << "the value of &foo is " << &foo << endl;
    cout << "the value of bar is " << bar << endl;
    cout << "the value of *bar is " << *bar << endl;
    cout << "the value of fubar is " << fubar << endl;
    cin.get();
}

それは出力につながります:

the value of foo is 81
the value of &foo is xx
the value of bar is xx
the value of *bar is 81
the value of fubar is 81

xxランタイムごとに変化する長い数値はどこにありますか。以下を追加すると:

    cout << "the address of foo is " << &foo << endl;
    cout << "the address of fubar is " << &fubar << endl;

それは次のことにつながります。

the address of foo is xx
the address of fubar is xy

実行時とはどこxyが異なりますかxx

  • 質問 1 : 宣言では、宣言は、それが使用されるまで、つまりどの時点で逆参照された変数になる*barまで、その時点でそれを「ポインター」にしますか? fubar = *barそれとも、ポインターは常に変数であり、それは私がすべてのヌービーを取得し、(おそらく正しくない) セマンティクスに縛られているだけですか?

  • 質問 2 :xxはランタイムごとに変化する長い数値なので、アドレス空間であるというのは正しいですか?

  • 質問 3fubar :とfooは同じ値を持ちますが、それらは完全に独立しており、共通のアドレス空間を持たないと考えるのは正しいですか?

4

2 に答える 2

6
  • 回答 1 : 正解です。変数barはポインターであり、 usingはポインターを*bar逆参照し、ポインターが指しているものに評価します。[一時的な] コピーとして評価されるのではなく、ターゲットへの参照として評価されることに注意してください。

  • 回答 2 : 「アドレス空間」は「アドレス」とは異なります。変数のアドレスは単にメモリ内の場所ですが、プログラムの「アドレス空間」は使用可能なすべてのメモリです。変数にはアドレス空間がありませんが、プログラムにはあります。プログラムの出力に表示されるのは、アドレス ( と のアドレスfoo)fubarです。

  • 回答 3 : はい、そのとおりです。それらは同じ値を持ちますが、一方に何が起こっても他方には影響しません (それらは異なるアドレスにあるため、異なるオブジェクトです)。

于 2012-07-18T16:11:08.007 に答える
1
  1. int*アドレスを格納するためのメモリ自体が少ない型として宣言されています。ポインター変数は常にポインターです。逆参照演算子を使用すると、保存したアドレスの変数への参照が取得されます。
  2. これは、変数が格納されている仮想メモリへの実際のアドレスです。それらは 16 進数で表示されます (ほとんどの場合)。「アドレス空間」ではありません(@Sethの回答を参照)
  3. はい。割り当てを行うと、 の値が にコピーfooされfubarます。fubarただし、 がポインターであり、それに割り当てた場合bar、逆参照された場所は同じになります。
于 2012-07-18T16:15:11.823 に答える