2021年12月22日 更新

値渡しと参照渡し

どうも、クラゲジュニアです。

今回はPHPを使用して解説します。

値渡しと参照渡しとは?

値渡し

実引数から仮引数へ値のみを複製して渡し、両者が異なる実体として扱われる引き渡し方法

参照渡し

仮引数と実引数が完全に同じ実体を表すように引数を受け渡す法式

引用

https://e-words.jp/w/%E5%8F%82%E7%85%A7%E6%B8%A1%E3%81%97.html

実際の挙動

変数の値を関数内で入れ替えるswap関数を実装します。

まず参照渡しを使用した場合です。
PHPでは、参照渡しを関数の仮引数に&をつける形で表現します。

<?php
function swap(&$a, &$b) {
  $tmp = $a;
  $a = $b;
  $b = $tmp;
}

$a = 8;
$b = 4;
echo "a is $a\n";
echo "b is $b\n";
swap($a, $b);
echo "a is $a\n";
echo "b is $b\n";
a is 8
b is 4
a is 4
b is 8

参照渡しを利用すると関数内の変化が、メインルーチンに影響を及ぼしているのがわかるかと思います。
変数の値を無闇に破壊することがあります。

この関数を値渡しに変更するどうなるでしょう。

<?php

function swap($a, $b) {
  $tmp = $a;
  $a = $b;
  $b = $tmp;
}

$a = 8;
$b = 4;
echo "a is $a\n";
echo "b is $b\n";
swap($a, $b);
echo "a is $a\n";
echo "b is $b\n";
a is 8
b is 4
a is 8
b is 4

メインルーチンの変数は変更されません。
変数の値を更新したい場合返り値を受け取る必要があります。

まとめ

参照渡しは、関数に渡した変数の値に変化を及ぼす方法、値渡しは、関数に渡した変数の値に変化を及ぼさない方法です。
実装方法は、異なりますが多くの言語に参照渡し・値渡しの概念は導入されています。

以上です。