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++参照