ポインタが別の変数を指すようにしたい場合は、変数のアドレスに&を付けて指定します。
int foo = 10;
int *bar = &foo;
ここで、上記と同じロジックに従い、代わりに参照型を作成するとします。
int foo = 10;
int &bar = &foo;
これはうまくいくはずだと思いますが、うまくいきません。なんで?
ポインタが別の変数を指すようにしたい場合は、変数のアドレスに&を付けて指定します。
int foo = 10;
int *bar = &foo;
ここで、上記と同じロジックに従い、代わりに参照型を作成するとします。
int foo = 10;
int &bar = &foo;
これはうまくいくはずだと思いますが、うまくいきません。なんで?
ポインタと参照は同じものではないからです。参照は単に「の別名」または「エイリアス」を意味すると考えることができます。
言い換えれば、あなたの例でbar
は別の名前です。foo
その場合、の別の名前にint &bar = foo;
なりたい場合は、 のアドレスをに割り当てたくありません。ただし、ポインターはそれが指しているオブジェクトのアドレスを格納するため、ポインターの場合、アドレスを取得してポインターに割り当てるには、アドレス取得演算子が必要です。bar
foo
foo
bar
foo
bar
参照は、参照と同じ型で初期化する必要があるため、機能しません。この場合:
int foo = 10;
int &bar = foo;
この方法で初期化しようとすると、次のようになります。
int &bar = &foo;
intへのポインタを使用してint参照を初期化しようとしています。タイプが一致しません。
コンパイラーは内部でポインターとして実装する場合がありますが、参照はポインターと同じではありません。参照は基本的に「私がバーについて言及するとき、私は本当にfooについて話している」と言っています。