2

次の例を検討してください。

void MyFunction(int &x){...}

void MyOtherFunction(int *x){...}

int main()
{
  int my_variable = 10;
  MyFunction(my_variable);
  MyOtherFunction(&my_variable);
}

これらのメソッドはどちらも参照によって変数を渡している (つまり、コピーを作成していない) と言っていますが、唯一の違いは MyOtherFunction がポインターを受け取っているということですか?

4

5 に答える 5

4

をコピーしないと言っているのは正しいですmy_variableが、ポインター参照ではありません。それらは 2 つの異なる型のセットです。

たとえば、ポインターを null にすることができ、 を呼び出すことができますMyOtherFunction(nullptr)

于 2016-11-18T00:42:00.387 に答える
1

はい、コピーはありません。ポインターを渡すということは、null ptr を渡すことができることを意味しますが、参照を使用すると、有効なオブジェクトを渡す必要があります。

int、float、および単純な変数の場合、渡されたパラメーターを関数内で変更する必要がない場合、値による受け渡しはそれほど高価ではありません。

于 2016-11-18T00:43:47.770 に答える
1

あなたの例では、決してコピーしていませんmy_variable(ただし、 を呼び出すときにポインターをコピーしていますがvoid MyOtherFunction(int *x){...}、それは問題ありません)。

2 つの関数の重要な違いMyFunction(int &x)は、適切な C++ 参照であり、(通常のコードでは) null になることはありませんが、 nullptr を渡すことができMyOtherFunction(int *x)、これは実行時にチェックする必要があります。ポインター バージョンは、必要に応じて内部で再割り当てすることもできますMyOtherFunction

于 2016-11-18T00:43:56.253 に答える
1

あなたが正しいです。両方の呼び出しで、参照によって変数を渡しています。ただし、C++ での参照によるこの用語は、C での同じ用語とは異なります。

C では、誰かが参照によって引数を渡したと言った場合、それは変数へのポインターを渡したという意味です。

C++ では、参照に新しい意味があります。それらは言語の仕様の一部です。したがって、誰かが参照によって引数を渡したと言った場合、通常は、対応するパラメーターが参照のように宣言されていることを意味します。:)

于 2016-11-18T00:46:48.283 に答える
1

参照渡しは へのエイリアスorignal objectです。ポインターによる受け渡しは、 のアドレスを保持するための追加の変数を作成しますoriginal object

于 2016-11-18T01:05:50.963 に答える