C での参照の再代入を理解する
C では、参照は宣言時に初期化が必要であり、再代入できないと一般的に言われています。しかし、最近の実験により、この概念に疑問が生じました。次のプログラムで参照の再割り当ての動作を調べてみましょう。
#include <iostream> #include <stdio.h> #include <conio.h> using namespace std; int main() { int i = 5, j = 9; int &ri = i; cout << "ri is : " << ri << "\n"; i = 10; cout << "ri is : " << ri << "\n"; ri = j; // *** Reassignment at Issue *** cout << "ri is : " << ri << "\n"; getch(); return 0; }
このプログラムは、参照 ri を整数変数 i に割り当て、ri を i の別名にします。最初、ri は値 5 を指します。i が 10 に変更されると、ri はこの変更を正しく反映します。ただし、重要な点は次のステートメントです: ri = j.
これは参照の再割り当てではありませんか?
驚くべきことに、答えは いいえです。 ri は依然として i への参照です。これを実証するには、ri と i のアドレスを比較します。これらは同一です。ここで観察しているのは、参照の再割り当てではなく、ri が指すメモリ位置に格納されている値の変更です。
簡単に言えば、ri = j は *(&ri) = j と同等です。ここで、&ri は ri のメモリ アドレスを取得し、* それを逆参照して値にアクセスします。
比較のために、const int &cri = i を作成すると、
要約すると、プログラムで見られるように、参照を C の新しい変数に再代入することはできませんが、参照するオブジェクトの値を変更するために使用できます。
以上がC で参照を再割り当てできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。