C++の値渡しとアドレス渡しと参照渡しの違い
以下のコードのコメントのところのはず。
#include <iostream> void f1(int p, int q) { // ←仮引数が値型 p = q; } void f2(int* p, int* q) { // ←仮引数がポインタ p = q; } void f3(int& p, int& q) { // ←仮引数が参照 p = q; } int main() { int a = 1; int b = 2; f1(a, b); // 値渡し /* ↑これは * { * int p = a, q = b; * p = q; * } * と書くのと同じ */ std::cout << a << "\n"; // => 1 f2(&a, &b); // アドレス渡し /* ↑これは * { * int *p = &a, *q = &b; * p = q; * } * と書くのと同じ */ std::cout << a << "\n"; // => 1 f3(a, b); // 参照渡し /* ↑これは * a = b; * と書くのと同じ */ std::cout << a << "\n"; // => 2 return 0; }
メモ
- 「参照」という言葉が名詞なのか動詞なのかわかりにくい気がする
- 「参照」という言葉が一般的なのが良くない気がする。一般的な「参照」を指しているのか,C++の機能の「参照」を指しているのかよくわからない
- C++の(名詞の)参照はそもそも変数ではなく,変数のエイリアスである
- (名詞の)参照は変数ではないので,いくら宣言してもメモリを食わない
- Javaで言うところの「参照渡し」は,C++で言うところの「アドレス渡し」にあたる
- C++で言うところの「参照渡し」はJavaにはない
- 「参照」といったとき,「ポインタ」を指す場合と「エイリアス」を指す場合があって言語によって異なる。Javaの参照はポインタで,C++の参照はエイリアス。
- 書けば書くほどわけがわからない。
- ポインタを使うべきか参照を使うべきか? → Effective C++参照