値渡し、ポインタ渡し、参照渡しの違い

2019-04-20

C や C++ では複数の変数の渡し方を明示的に実装するようです。

C/C++ を書く人には恐らく常識ですが、Java から入ったひよこエンジニアはしばらく存在を知りませんでした。Python の変数にもイミュータブル型、ミュータブル型がありますが、前者は値渡し、後者は参照渡しというイメージです。

(C/C++ は書いたことがないので間違っているかもしれない...)

値渡し

#include <stdio.h>

int main() {
  int a = 100;
  int b = *a;
  b += 10;

  printf("a: %d", a);
  printf("b: %d", b);
}

この時の出力は以下のようになります。

a: 100
b: 110

アスタリスクを使うと値渡しができます。

ポインタ渡し

#include <stdio.h>

int main() {
    int a = 100;
    int b = &a;
    b += 10;

    printf("a: %d", a);
    printf("b: %d", b);
}

この時の出力は以下のようになります。

a: 110
b: 110

ポインタ渡しはアンパサンドで書きます。値ではなくポインタが渡されているので、渡した先の変数の値を変更すれば同じポインタを参照している変数の値がすべて変更されます。

値が設定されていない場合もポインタを渡すことができるので、null チェックをしないとエラーの温床になります。

参照渡し

上二つの例は C で書いていましたが、参照渡しは C にはありません。C++ ではより安全にポインタ渡しのようなことが実現できるようになったようです。

#include <iostream>

int main() {
  int a = 100;
  int& b = 10;

  std::cout << a << std::endl;
  std::cout << b << std::endl;
}

この時の出力は以下のようになります。

a: 110
b: 110

参考

C++ 値渡し、ポインタ渡し、参照渡しを使い分けよう | Qiita