何が起こるのですか:
値でポインターを渡すため、関数でローカル コピーが作成されますf
。次に、そのコピーに別の値 (b へのポインター) を割り当てて、関数を終了します。元のポインターは変更されません。
ここで、関数を次のように変更するとします。
void f(int * & p){
int b = 10;
p = &b;
}
家でやらないで!
これで、実際のポインターが関数に渡され、コピーは作成されません。次に、bへのポインターがそれに割り当てられ、関数が戻ります。p1
次に、存在しないために無効になった値 - が指す値にアクセスしようとしますb
。ここで未定義の動作が発生します。最良のシナリオは、すべてが実際に予想どおりに機能することです。最悪のシナリオは、アクセス違反が発生するか、さらに悪化することです-プログラムの一部のデータが破損する可能性があります(すべてプラットフォームとコンパイラ)。
C++ コンパイラがそれについて通知しないのはなぜですか? 一般に、C++ は自分の足を撃たないように注意する必要がないためです (実際、C++ を使用して自分の足を撃つ方法はたくさんあります。これらを含む本を積み重ねると、月に到達します)。C++ は、指定されたとおりに実行するだけです。へのポインタを取得したいb
ですか?わかりました、問題ありません。関数からポインタを返したいですか?これは単に 32 ビットの整数値です。
要点は、C++ で作成する場合、そのようなコードを作成しないように十分に注意する必要があるということです。
編集:コメントに応じて
データが建物であり、ポインタがその建物の住所が記載された一枚の紙であると想像してください。ポインターを値で渡す場合:
void f(int * p)
別の紙を取り、住所をコピーしたようなものです。消去して別の住所に変更しても、元の紙の元の住所は変更されません。
今、次のようなことをすると:
void f(int * p)
{
*p = 4;
}
紙に書かれた住所に実際に行って、建物の中で何かを変えたようなものです。その後、元の紙に記載されている住所に行くと、建物が変更されます。
最後に、次のようなことをすると:
void f(int * & p)
{
}
元の紙を関数に渡したようなものなので、アドレスを変更すると関数の外でも変更されます。
これがポインタの仕組みを理解するのに役立つことを願っています.