私が参照変数のアドレスが一度 セット変更することができないことを知って、
の参照は、アドレスとは何の関係もありません。参照を特別なポインタとは考えないでください。
コンパイラが参照を実装する方法について話している場合を除きます。しかし、これは抽象化の全く異なるレベルです。 C++プログラマーレベルでは、コンパイラーライターと同じ観点から言語を見ていません。 「参照変数のアドレス」などはありません。オブジェクトにはアドレスがあり、参照はオブジェクトの名前を付ける別の方法です。
または、私が初心者に説明するように、参照番号はです。
しかし、コマンドを実行すると、参照の値はどのように変更されますか? アドレスは同じですか?
int &ref = a; //&ref is 0x28fee
あなたはa
への参照であることをref
を宣言されています。次の行で
。上記の説明を用いて、ref
はa
である。したがって、その後で&ref
と書くと(&
文字を使用して参照を宣言するのではなく、アドレス演算子を呼び出す)、何が起こるかは&a
を書くときと同じです。従って、結果が同一であることは驚くべきことではない。 1つのオブジェクトと同じオブジェクトなので、アドレスは同じでなければなりません。
ref = b; //value of ref = 5, address is still 0x28fee
これはa = b;
を書くことと同じです。 ref
はa
と言う別の方法なので、b
の値はa
に割り当てられます。値がint
に割り当てられると、アドレスは変更されません。
最後には、それは「&」記号は、我々がポインタで使用 1と同じであると仮定することは正しいのですか?
いいえ、まったくありません。上記から私のポイントを反復する:&
は、C++での意味が異なります。参照番号またはを宣言してオブジェクトのアドレスを取得するために使用します。実際には、のように、&
もビット単位のAND演算子であると考えると、さらに意味があります。 &
のペア、すなわち&&
は、論理AND演算子とC++ 11のrvalue参照を含むように、可能な意味のリストを拡張します。ビューの教示点から
、&
を参照宣言とアドレスのオペレータのためにオーバーロードされることを当然の不幸です。私が知る限り、&
が参照のために選択されました。当時、Cとの下位互換性は当時の大きな懸念事項であり、ref
をキーワードとして追加すると、新しいキーワード(例:ref
)をC++に追加することは困難でした。 int ref = 0;
のようなCコードはもはやコンパイルされません。
C++は少なくともいくつかの新しいキーワード(たとえばthrow
)を導入する必要がありましたが、場合によっては、技術的に可能であり、かつ/または政治的にそれらなしで行う必要がありました。
誤解は、あなたが*変数*のアドレスを取っていると信じている可能性がありますが、これは真実ではありません。むしろ、(正確にはglvalueの)* value *のアドレスを取っており、参照を評価することによって得られた値は参照にバインドされた値です。 –
参照は実際にはメモリの場所に格納される必要はありません。それがアドレスを取っていると言っても、それは正しいことではありません。コンパイラは上記のコードでは、 'ref'のためのメモリ位置を作成することさえなく、代わりに' ref'が使われるどこでも 'a'を置き換えることはありません。 –
参照は単に変数名の名前を変更しています。参照にはメモリがありません。このリンクを参照してください。http://www.tutorialspoint.com/cplusplus/cpp_references.htm – Shiv