0

重複の可能性:
参照による受け渡しと値による受け渡しの違いは何ですか?

Cでは引数は値で渡されると読みましたが、引数を値(Cのように)または参照(C ++-C#のように)で渡すことの違いは何ですか?ポインタと参照の違いは何ですか?

void with_ptr(int *i)
{ *i = 0; }

void with_ref(int &i)
{ i = 0; }

これらの場合、両方の値が変更されますか?はいの場合、なぜC ++は参照によって引数を渡すことができるのですか?関数内でi値を変更できるかどうかは明確ではないと思います。

4

5 に答える 5

10

値による引数の受け渡しと参照による引数の受け渡しの違いは何ですか

値を渡すと、関数の呼び出し時に値がコピーされるため、変数への変更は関数に対してローカルになります。参照引数への変更は、元の値に伝播されます。

ポインタと参照の違いは何ですか?

コードで見たように、違いは主に構文です。さらに、ポインタを再割り当てして他の何かを指すようにすることもできますが(宣言されていない限りconst)、参照はできません。代わりに、参照に割り当てると、参照されるに割り当てられます。

関数内でi値を変更できるかどうかは明確ではないと思います。

それどころか、それは絶対に明らかです。関数のシグネチャはそのことを示しています。

実際には、関数の外では明確でない場合があります。refそのため、たとえばC#の元のバージョンでは、 (f(ref x)プレーンではなく)を使用して参照による呼び出しに明示的に注釈を付ける必要がありましたf(x)f(&x)これは、ポインタが渡されたことを明確にするためにC++で関数を呼び出すのと似ています。

しかし、最近のバージョンのC#では、ref呼び出しの使用はオプションになりました。これは、結局のところ、十分な利点が得られなかったためです。

于 2012-05-15T09:44:28.357 に答える
2

このことを考慮:

i1)参照による受け渡しは、代わりに、より単純な要素アクセスを提供します *i

null2)通常、メソッドへの参照を渡すことはできませんが、nullポインターを渡すことはできます

3)参照アドレスを変更することはできませんが、ポインター用に変更することはできます(ただし、ポインター自体は値によって渡されるため、この変更は関数の終了時に破棄されます)

願わくば、これは少し役に立ちました

于 2012-05-15T09:46:10.437 に答える
1

実際、最初のケースでは、引数を変更することはできません。ポインタ自体は不変であり、ポインタが指す値のみを変更できます。

はいの場合、なぜC ++は参照によって引数を渡すことができるのですか?

ポインタは非常に簡単に誤用される可能性があるためです。ほとんどの場合、参照が優先されます。あなたの場合、にを渡すとどうNULLなりますwith_ptrか?未定義の動作が発生しますが、を使用した場合は不可能ですwith_ref

関数内でi値を変更できるかどうかは明確ではないと思います。

非常に明確です。非参照によってパラメーターを受け取る関数を見つけた場合、constそれが変更されると想定できます。

于 2012-05-15T09:43:28.653 に答える
0

メソッドが引数の値を変更できるのは、これが参照によって渡された場合だけだと思います。メソッドで引数を値で渡すと、その値にどのような変更を加えても、これは親メソッドでは使用できなくなります。

于 2012-05-15T09:43:55.960 に答える
0

私の知る限り、参照は変更できない(常に同じものを指している)という意味で安全に使用できると思います。ローカル変数の場合は初期化する必要があります。ただし、ポインタは別の場所を指すように変更できます。

int x = 10;
int &y = x;
int *p = &x;
p++; //Legal if you know what's next
y++; // Increases the value of x. Now x = y = 11;

私の2セントとして、参照変数は、初期化されたのと同じメモリアドレスの単なる代替名だと思います。これもかなりいい説明です: http ://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf

于 2012-05-15T09:53:24.517 に答える