14405


`int& a`これなんて読みますか  
ついでに`int*b`や`int c`とどんな関係にありますか  
特に知りたいのは

[code]

    int c=1;
    int& a=c; ←ここで何に初期化しているのか
    
[/code]

ハードウェアレベルでのaメモリ上の値とcメモリ上の値が気になります

付属は  
`int*b`とはどのような代入関係が許されるのかです


CC BY-SA 3.0
2015-08-12T01:11:41.513
14300
2015-08-14T17:18:39.243
2015-08-12T11:56:03.930
49
10890
question
c++
int& aこれなんて読みますか


正直入門書をきっちり読まれるほうが理解が早いと思いますが・・・

`int c=1;` は `int` である変数 `c` を右辺値 `1` で初期化  
`int* b=&c;` は `int` へのポインタである変数 `b` を `c` へのポインタ右辺値で初期化  
`int& a=c;` は `int` への参照 `a` を `c` に初期化（設定）

解説するとしたら上記ですが、はっきり言ってこれだけ読んでも謎呪文なだけです。  
が、参照とは何かをこの場で詳しい解説するには余白が狭すぎるでしょう。  
実装寄りの説明をしても言語仕様の意図するところの理解にはいたらないと思います。

上記３行の後に `b=&a;` と書くことができます。

まああえて言えば [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の参照はポインタの
syntax sugar ですよ、はい。  
`int& a=c;` は [c へのポインタ] を a に設定してるだけですよ。  
初期化後の `a` に対する操作はソースコード上直接操作に見える記述をすることになりますが、  
生成される機械語ではポインタ経由の操作に翻訳されるだけです。


CC BY-SA 3.0
2015-08-12T08:00:49.107
14316
2015-08-12T08:00:49.107
8589
14300
answer


型なら`int`「値型」、`int*`「ポインタ型」、`int&`「参照型」です。ただし、`int`に限りません。

[code]

    #include<iostream>
    
    using namespace std;
    
    int main(){
        int c=1;
        int*b=&c; //特に値が入っていなかったのでｃを
        int& a=c;
        //値の表示
        cout<<c<<endl;
        cout<<*b<<endl;
        cout<<a<<endl;
        //アドレス表示
        cout<<&c<<endl;
        cout<<b<<endl;
        cout<<&a<<endl;
    }
    
[/code]

このプログラムを実行するとすべて同じアドレスを持っていることがわかります。  
ポインタ型との違いはアドレスが変更可能か可能でないかということになります。  
これは宣言時に＆（左辺値参照宣言子）を利用できても、それ以降は左辺値として＆（アドレス演算子）を利用することができないからです。

参考：[1](http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzarg/lvalue.htm?lang=ja),[2](https://msdn.microsoft.com/ja-
jp/library/w7049scy%28v=vs.120%29.aspx),[3](https://msdn.microsoft.com/ja-
jp/library/Cc406735.aspx)


CC BY-SA 3.0
2015-08-13T05:56:55.467
14354
2015-08-13T06:02:43.437
2015-08-13T06:02:43.437
10455
10455
14300
answer


何故か回答されない読み方については、  
私は単純に「イントアンドエー」と読んでいます。


CC BY-SA 3.0
2015-08-13T13:46:22.463
14395
2015-08-13T13:46:22.463
5288
14300
answer


`int& a`の読み方は個人的にint アンパ(サンド)としています。  
文法的な解説は他の方がしてくださっていますので割愛しますが、  
ハードウェアレベルでのアドレスは通常知ることができません。  
なぜなら通常のプログラムがアクセスできるメモリの領域は  
OSの仕組みで、仮想アドレス領域となっていって実際の物理アドレスとは違うからです。  
Windows、Linuxはそのようになっています。  
<https://msdn.microsoft.com/ja-
jp/library/windows/hardware/hh439648%28v=vs.85%29.aspx>


CC BY-SA 3.0
2015-08-14T02:02:35.280
14405
2015-08-14T02:02:35.280
7744
14300
answer


無理やり日本語で理解しようとするからわかりにくいのではないかと思います。  
例えば、英語で考えると以下のように発音できます。

int & a = integer reference a  
int * a = integer pointer a  
int a = integer a

int & aが& int aではなくint &
aである理由は英語の発音に由来しているからではないでしょうか？そこら辺はC/C++の歴史に詳しい人が解説してくださると思います。


CC BY-SA 3.0
2015-08-14T17:18:39.243
14434
2015-08-14T17:18:39.243
14300
answer