3

このコードでは:

  int* a;
  int* b;
  int c;
  int* d;
  a=new int(5);
  b=&(*a);
  c=*a;
  d=&c;
  cout<<"*a = "<<*a<<endl;
  cout<<"a = "<<a<<endl;
  cout<<"b ="<<b<<endl;
  cout<<"d = "<<d<<endl;

私は得る:

*a = 5
 a = 0x83a2008
 b =0x83a2008
 d = 0xbfbfe540

なぜdはbと違うのですか? どちらも &(*a) ではありませんか? 1 行で d の結果を取得するにはどうすればよいですか?

どうもありがとう。

4

7 に答える 7

7

aは動的に割り当てられた場所を指し、値 5 を保持します。 を実行すると、その動的に割り当てられた場所からc = *a;5 が にコピーされます。次に、のアドレスを取得して割り当てます(そして印刷します)。ccd

最終的には次のようになります。

ここに画像の説明を入力

実線は、場所を参照するポインターを示します。破線はデータの移動を示します。

于 2012-10-01T18:37:12.757 に答える
6

cは独自のものintであり、 ではありませんint*。と言うとき、実際には が指す値をメモリ内の独自のスペースを持つ別の整数c = *aに割り当てています (これは ではありませんが、メモリ内のどこかに存在する必要があります)。aintint*

したがって、 と言うと、の値ではなく、d = &cのアドレスが得られます。ca

于 2012-10-01T18:36:50.543 に答える
1
于 2012-10-01T18:42:27.543 に答える
1

d = &c;

dはによって指定されcた保管場所を指していますが、これは によって指された保管場所ではありませんa

于 2012-10-01T18:36:31.913 に答える
1

d は、ローカル スタック変数である c のアドレスです。b は、ヒープに割り当て、そのアドレスを a に格納した整数のアドレスです。

于 2012-10-01T18:37:04.287 に答える
1

cは整数の新しいインスタンスであるため、d等しくaないbです。したがって、格納されている値のアドレスを取得しようとすると、a正確に のアドレスが取得されますa。しかし、最初に の値を割り当てaてからcのアドレスを出力すると、 とcは異なるアドレスが得られますa。C++ では、Java や C# のような参照ではなく、実際のオブジェクトを操作します。変数に値を割り当てると、この変数に格納されているすべてのフィールドがコピーされますが、注意してください。デフォルトでは、=オペレーターはディープ クローンを作成しません。

于 2012-10-01T18:37:20.980 に答える
0

これに入るすべてのルールと微妙な点を知っているわけではありませんが、コンパイラーは単純化&(*a)してa. したがって、( ) を指すbのと同じ整数を指すように初期化しています。次に、整数を値で にコピーしています。次に、を指すように初期化しています。したがって、同じ整数を指しますが、別のものを指します。ab = acdcabd

于 2012-10-01T18:37:18.717 に答える