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;
}
4

5 に答える 5

5

結果は未定義ではありません。ポインタj を値で渡すので、関数内でそのコピーを変更します。オリジナルjは変更されないままなので、結果はまだ10です。

于 2012-11-09T09:54:26.987 に答える
1

でポインターが変更されていないため(ポインターのコピーが に渡される)、ローカル変数lがの外部でアクセスされないため、プログラムは整形式です。f()jmain()jf()

于 2012-11-09T09:54:44.100 に答える
1

コードを分解しましょう。

最初に に 10 を割り当てiます。次にj、 のアドレスを指定しiます。

f では、 が指す値ではなく、pの値をに設定します。のパラメータとして渡されると、p 値がコピーされます (アドレス値)。kf()

結果として、 が指す値を変更することはなく、injのローカル値を変更するだけです。jf()10

于 2012-11-09T09:55:01.133 に答える
1

コードにはまったく問題はありません。のパラメーターはf参照渡しではないため、f変更する方法がなく、終了後も を指しています。jjif

于 2012-11-09T09:55:49.173 に答える
0

参照渡し/値渡しについて混乱しています。ポインターを渡す場合、ポインター自体は、f()メモリのチャンクを指す関数に渡す数値です。f()(ポイント先のメモリのチャンクではなく)の *p 変数を変更しても*p、関数には影響しませんmain()

ポインタは、メモリのアドレスを保持する単なる変数です。それ自体は、値によって渡されます。ポインターが指す変数のみが参照によって渡されます。

于 2012-11-09T09:55:02.083 に答える