解説
参照は、少し高度なプログラムを書き始めると、必ず出てくる概念です。
多くのプログラミング言語では、変数には数値などの値を直接格納するだけでなく、配列などのより高度な対象を格納しています。これらの数値や配列などは、実際にはメモリー上にデータとして存在しています。プログラムでは、変数の操作を通して、このメモリー上の値を書き換えます。
またプログラムでは、変数の内容をよく、他の変数にコピーします。その際、数値などの直接的な値は、メモリー上のごく小さな範囲のデータなので、他の変数にコピーした際に、その値を丸ごと複製して、メモリー上に新しいデータ領域を確保します。
しかし、配列などは、メモリー上でかなり大きなデータ領域を占めています。そのため、他の変数にコピーした際に、全てのデータを丸ごとコピーするのは大変です。そのため、元々変数には、そのデータ領域にアクセスする権利のみが格納されています。それは、部屋の鍵のようなもので、プログラムでは参照と呼ばれます。プログラミング言語によって、その参照は、抽象化されたアクセスする権利だったり、メモリー上の実際の位置だったりします。
ただ、メモリーを直接操作することは、高度なことができる反面、プログラマーの技量によってバグを大量に生み出す原因にもなってしまいます。そのため、比較的新しいプログラミング言語では、参照は、数値以外のデータを扱う時などに限定されて使われ、その参照も抽象化されたデータにアクセスする権利であることが多いです。
どちらにしろ、数値よりも複雑な配列などのデータは、変数に入っているのはたいてい参照です。そのため、変数で値をコピーした気になり、コピーした先で中身のデータを書き換えると、元のデータも書き変わるので注意が必要です。
サンプル
参照の動作の様子が分かる処理を、JavaScriptで簡単に書いてみます。
<html>
<head>
<title>「参照の動作の様子が分かる処理」のサンプル</title>
</head>
<body>
<pre><script type="text/javascript">
// 配列1を作成して出力
var arr1 = [0, 1, 2, 3, 4, 5];
document.writeln("arr1 : " + arr1.toString());
// 配列2にコピーして出力
var arr2 = arr1;
document.writeln("arr2 : " + arr2.toString());
// 配列2を書き換えて、配列1と2を出力
arr2[1] = 10;
arr2[2] = 20;
document.writeln("arr1 : " + arr1.toString());
document.writeln("arr2 : " + arr2.toString());
</script></pre>
</body>
</html>
arr1 : 0,1,2,3,4,5 arr2 : 0,1,2,3,4,5 arr1 : 0,10,20,3,4,5 arr2 : 0,10,20,3,4,5
