をゴミがプリントアウトされた場合、それらの一方のみがactualyである、しかし、あなたは「ちんぷんかんぷん」の値を得ることができる2つのスポットがあります。
このcout << &b << endl << &a << endl;
は、アドレス-operatorを使用してa
とb
のアドレスを出力します。あなたが見ているのは、a
とb
の値ではなく、メモリに格納されている場所です。それらは16進数値で、プログラムを実行するたびに変更されます。これは予想される動作です。
次に、このコンストラクトがあります:*(pb + 1)
これは実際には未定義の動作を呼び出しています。しかし、なぜこれは?まずpb
はポインタであるため、アドレス、具体的にはb
が格納されているメモリアドレスを格納します。 pb
を直接印刷すると、cout << &b
と同じ結果になるか、または参照解除演算子*
を使用して逆参照することができます。したがって、このcout << *pb
は、アドレスpb
が(10
btw)を指していない値を印刷します。あなたの声明が間違っているところに - はpb
の値を増やしていませんが、アドレスはpb
に保存されています。したがって、それはもはやb
の値を指すのではなく、メモリのどこかの他の値を指しています。次に、このアドレスを逆参照してランダムな値を読み込みます。これがあなたの "ゴミ"値です。
pb
の値を大きくすることをお勧めします。したがって、cout << (*pb + 1)
は11
(角括弧が配置されているところに注意)を印刷します。しかしcout << b
はまだ10
になります。あなたが実際にあなたがこれを行うことができますbの値に変更したい場合は:今すぐb
を
int b = 10;
int *pb = &b;
*pb += 1;
cout << b;
をb
自体に触れることなく1増加しました。
*未定義の動作* - '*(pb + 1);'は範囲外にアクセスします。 – UnholySheep
これは未定義の動作です。そして、これは、 –
との呼び出し規約で、 'pb'は* single *' int'変数を指しているからです。 '*(pb + 1)'を実行すると、 'pb [1]'と同じです。これは配列として 'pb'を使い、* second *値を配列に出力します。これは、 'pb'が指すものの範囲外であり、*未定義の動作*につながります。定義されていない動作は、あなたの全プログラムを不正な形式にして無効にします。 –