私は何年もC++でプログラミングしていないので、ポインターで思い出をリフレッシュすることにしました。
2つの数値を交換する典型的な例では、例は次のとおりです。
void swapPointersClassic(double *num1, double *num2)
{
double temp;
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
これにより、関数を次のようswapPointersClassic(&foo, &bar);
に呼び出すことができます。変数fooとbarの両方のメモリアドレスを渡すため、関数は値を取得してスワップを実行します。しかし、私は疑問に思い始めました、なぜ私は次のことができないのですか?
void swapPointers(double *num1, double *num2)
{
double *temp;
temp = num1;
num1 = num2;
num2 = temp;
}
(double値* num1を格納するための完全な一時ストレージの代わりに)メモリアドレスnum1を格納するために十分な一時ストレージを作成するだけでよいので、それは私にはもっと理にかなっているようです。ただし、関数スコープはポインタスワッピングの効果を制限しているようです。呼び出しを行った後swapPointers(&foo, &bar);
、関数swapPointers内でfooとbarが実際にスワップされていることがわかります。swapPointers関数を終了すると、fooとbarはスワップされなくなります。誰かが私がこれが事実である理由を理解するのを手伝ってもらえますか?この動作は、典型的な値渡しアプローチを思い出させますが、ここではポインターを渡します。つまり、これらのポインターが指す値にのみ触れることができ、ポインター自体には触れることができないということですか?