結果は未定義か何かだと思いますが、出力は「10」です。なぜですか?
関数が呼び出された後、メモリが破壊されたと思います。
#include <iostream>
void f(int *p)
{
int l = 20;
int *k = &l;
p = k;
}
int main()
{
int i = 10;
int *j = &i;
f(j);
std::cout << *j;
return 0;
}
結果は未定義か何かだと思いますが、出力は「10」です。なぜですか?
関数が呼び出された後、メモリが破壊されたと思います。
#include <iostream>
void f(int *p)
{
int l = 20;
int *k = &l;
p = k;
}
int main()
{
int i = 10;
int *j = &i;
f(j);
std::cout << *j;
return 0;
}
結果は未定義ではありません。ポインタj を値で渡すので、関数内でそのコピーを変更します。オリジナルjは変更されないままなので、結果はまだ10です。
でポインターが変更されていないため(ポインターのコピーが に渡される)、ローカル変数lがの外部でアクセスされないため、プログラムは整形式です。f()jmain()jf()
コードを分解しましょう。
最初に に 10 を割り当てiます。次にj、 のアドレスを指定しiます。
f では、 が指す値ではなく、pの値をに設定します。のパラメータとして渡されると、p 値がコピーされます (アドレス値)。kf()
結果として、 が指す値を変更することはなく、injのローカル値を変更するだけです。jf()10
コードにはまったく問題はありません。のパラメーターはf参照渡しではないため、f変更する方法がなく、終了後も を指しています。jjif
参照渡し/値渡しについて混乱しています。ポインターを渡す場合、ポインター自体は、f()メモリのチャンクを指す関数に渡す数値です。f()(ポイント先のメモリのチャンクではなく)の *p 変数を変更しても*p、関数には影響しませんmain()。
ポインタは、メモリのアドレスを保持する単なる変数です。それ自体は、値によって渡されます。ポインターが指す変数のみが参照によって渡されます。