0

最初に言わせてください。タイトルが、ここやインターネットで何度も回答された質問をしている疑いがあることを知っています. 私は確かに調査を行いましたが、満足のいく答えを見つけることができません。

私の質問は最後にこれに帰着します。Java Call By Value と C++ Call By Reference (ポインターを使用する場合) はなぜですか?

参照を渡す場合は Java で、ポインタを渡す場合は C++ でメソッド呼び出しを検討してください。結局、どちらの場合も、呼び出し元に表示される変更を加えることができます。また、どちらの場合も、オブジェクトのアドレスを関数に渡しています。実際、私はコピーしています。つまり、ポインターを渡すときにC ++でも値による呼び出しを行っていますよね?

次のコードを実行することで、その状況を簡単に確認できます。

#include <iostream>

void modify (int *i) {
    int a = 5;
    i = &a;
}

int main () {
    int b;
    int *i = &b;
    std::cout << i << std::endl;
    modify(i);
    std::cout << i << std::endl;
    return 0;
}

同じ住所を2回印刷します。

私にとっては、スワップ関数を実行できるプロパティを使用して参照による呼び出しを正当化するだけでは十分ではありません。参照ごとに呼び出しを行うものの核心を知りたいです。

前もって感謝します。

4

2 に答える 2

0

あなたが与える例は、参照による呼び出しの不適切な使用です。関数ではmodify

void modify (int *i) {
    int a = 5;
    i = &a;
}

aスタック上にあるローカル変数を宣言します。範囲外になると、そのアドレスは意味がありません。したがって、アドレスをatoiに割り当てても、何iを指すかには影響しません。

iしたがって、参照による呼び出しを機能させるのは、関数内のポイントの値を変更できることです。例えば:

void modify (int *i) {
    int a = 5;
    *i = a;
}

したがって、メイン関数では、次のように呼び出すことができます。

int b = 2;
int *i = &b;
std::cout << *i << std::endl;  //This will print 2
modify(i);
std::cout << *i << std::endl;  //This will prints 5
于 2014-01-20T18:57:23.647 に答える