結果は未定義か何かだと思いますが、出力は「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()
j
main()
j
f()
コードを分解しましょう。
最初に に 10 を割り当てi
ます。次にj
、 のアドレスを指定しi
ます。
f では、 が指す値ではなく、p
の値をに設定します。のパラメータとして渡されると、p 値がコピーされます (アドレス値)。k
f()
結果として、 が指す値を変更することはなく、inj
のローカル値を変更するだけです。j
f()
10
コードにはまったく問題はありません。のパラメーターはf
参照渡しではないため、f
変更する方法がなく、終了後も を指しています。j
j
i
f
参照渡し/値渡しについて混乱しています。ポインターを渡す場合、ポインター自体は、f()
メモリのチャンクを指す関数に渡す数値です。f()
(ポイント先のメモリのチャンクではなく)の *p 変数を変更しても*p
、関数には影響しませんmain()
。
ポインタは、メモリのアドレスを保持する単なる変数です。それ自体は、値によって渡されます。ポインターが指す変数のみが参照によって渡されます。