2016-04-02 21 views
2

参照変数を見つけたばかりで、私に迷惑をかけている質問はほとんどありません。以下のコードをご覧ください。参照変数のアドレスと値C++

int a = 3;  //&a is 0x28fee 
int b = 5;  //&b is 0x16faa 
int &ref = a; //&ref is 0x28fee 
ref = b;  //value of ref = 5, address is still 0x28fee 

私が参照変数のアドレスは、一度設定変更することができないことを知っているが、私は、コマンドを実行したときにどのように私の参照の値の変化ですが、アドレスは同じですか?

また、refの値は3でなければならないのと同じであるか、またはaの値が5に変更されるべきではないことがあります。

最後に、「&」の記号がポインタで使用する記号と同じであると仮定するのは正しいですか?

+0

誤解は、あなたが*変数*のアドレスを取っていると信じている可能性がありますが、これは真実ではありません。むしろ、(正確にはglvalueの)* value *のアドレスを取っており、参照を評価することによって得られた値は参照にバインドされた値です。 –

+1

参照は実際にはメモリの場所に格納される必要はありません。それがアドレスを取っていると言っても、それは正しいことではありません。コンパイラは上記のコードでは、 'ref'のためのメモリ位置を作成することさえなく、代わりに' ref'が使われるどこでも 'a'を置き換えることはありません。 –

+0

参照は単に変数名の名前を変更しています。参照にはメモリがありません。このリンクを参照してください。http://www.tutorialspoint.com/cplusplus/cpp_references.htm – Shiv

答えて

5

私が参照変数のアドレスが一度 セット変更することができないことを知って、

の参照は、アドレスとは何の関係もありません。参照を特別なポインタとは考えないでください。

コンパイラが参照を実装する方法について話している場合を除きます。しかし、これは抽象化の全く異なるレベルです。 C++プログラマーレベルでは、コンパイラーライターと同じ観点から言語を見ていません。 「参照変数のアドレス」などはありません。オブジェクトにはアドレスがあり、参照はオブジェクトの名前を付ける別の方法です。

または、私が初心者に説明するように、参照番号です。

しかし、コマンドを実行すると、参照の値はどのように変更されますか? アドレスは同じですか?

int &ref = a; //&ref is 0x28fee 

あなたはaへの参照であることをrefを宣言されています。次の行で

。上記の説明を用いて、refaである。したがって、その後で&refと書くと(&文字を使用して参照を宣言するのではなく、アドレス演算子を呼び出す)、何が起こるかは&aを書くときと同じです。従って、結果が同一であることは驚くべきことではない。 1つのオブジェクトと同じオブジェクトなので、アドレスは同じでなければなりません。

ref = b;  //value of ref = 5, address is still 0x28fee 

これはa = b;を書くことと同じです。 refaと言う別の方法なので、bの値はaに割り当てられます。値がintに割り当てられると、アドレスは変更されません。

最後には、それは「&」記号は、我々がポインタで使用 1と同じであると仮定することは正しいのですか?

いいえ、まったくありません。上記から私のポイントを反復する:&は、C++での意味が異なります。参照番号またはを宣言してオブジェクトのアドレスを取得するために使用します。実際には、のように、&もビット単位のAND演算子であると考えると、さらに意味があります。 &のペア、すなわち&&は、論理AND演算子とC++ 11のrvalue参照を含むように、可能な意味のリストを拡張します。ビューの教示点から


&を参照宣言とアドレスのオペレータのためにオーバーロードされることを当然の不幸です。私が知る限り、&が参照のために選択されました。当時、Cとの下位互換性は当時の大きな懸念事項であり、refをキーワードとして追加すると、新しいキーワード(例:ref)をC++に追加することは困難でした。 int ref = 0;のようなCコードはもはやコンパイルされません。

C++は少なくともいくつかの新しいキーワード(たとえばthrow)を導入する必要がありましたが、場合によっては、技術的に可能であり、かつ/または政治的にそれらなしで行う必要がありました。

+0

素晴らしいasnwer @ChristianHackl、これはすべての私の疑問をクリアし、また私にC++の背景についてのいくつかの情報をくれました。 –

3

コマンドを実行すると、参照の値はどのように変更されますか?アドレスは同じですか?

参照は別名です。値をrefに割り当てると、実際には変数aに割り当てられます。あなたはなぜ住所が変わると思いますか?

または多分べきではないの値の変化を5

にこれはあなたの例では、参照refの値を変更すると、あなたにもsubstitiuteできaからref、あなたがa = bを持って、正確です。

最後に、「&」の記号がポインタで使用する記号と同じであると仮定するのは正しいですか?私はあなたがここに尋ねるのかわからないのです

は、&は、変数aのアドレスを取るために、ここで使用されていない、あなたが参照したいことを指定するために使用されます。

+0

あなたは私の質問について正しい考えを持っていました。私はその部分と最も混同されました。ありがとう –