キーワード辞典
「値渡し」と「参照渡し」

登録日 13/04/18   更新日 13/04/18


「値渡し」と「参照渡し」

かなり無理矢理な例えですが...。

主任が、自分のフォルダの中にxという名前のデータを持っています。 データxには「32」という数値が記憶されています。

主任は、そのデータxをコピーし、社員Aに渡しました。 社員Aは主任から渡されたデータxを自分のフォルダに入れ、アクセスしてその数値を「64」に変更しました。 これにより社員Aのデータxは最初の数値「32」から「64」へと変更されましたが、 主任が自分のフォルダの中に持つデータxは変更されず「32」のままです。 これをプログラムの世界では「値渡し」といいます。 他人に無暗に自分のフォルダの中を触られることが無いので安心ですが、 受け渡しのためのコピーが増えて場所を取られたりします。 主任が、社員Aが自身のデータxに対して行った変更結果を得る為には、 社員Aから社員Aのデータxのコピーを受け取る必要が有ります。

続いて、主任は、自分のデータxのショートカットを社員Bに渡しました。 社員Bはそのショートカットを自分のフォルダに入れ、アクセスしてデータxを開き、その数値を「128」に変更しました。 これにより、主任が自分のフォルダの中に持つデータxは、「128」に変更されました。 これをプログラムの世界では「参照渡し」といいます。 他人のフォルダの中を触ることになるので注意が必要になりますが、 フォルダのショートカットを渡しておけば一度にまとめて参照出来るので便利でもあります。

上記の例をプログラムに置き換えると、次の様な感じになります。たぶん。

#include <stdio.h>
int  syain_a(int x);
void syain_b(int *x);

void main(void) {
   int x = 32;
   int z = syain_a(x);	/* 社員Aにxをコピー。Aはxの値を変更しzで返す。 */
   printf("x=%d, z=%d¥n", x, z);
   x = syain_a(x);		/* 社員Aにxをコピー。Aはxの値を変更しxで返す(上書き)。*/
   printf("x=%d, z=%d¥n", x, z);
   syain_b(&x);			/* 社員Bにxのショートカットを渡す。 */
   printf("x=%d, z=%d¥n", x, z);
 }

int syain_a(int x) {
   return x = 64;		/* 社員Aはコピーのxの値を64にして返す。 */
 }

void syain_b(int *x) {
   *x = 128;			/* 社員Bはショートカット先のxの値を128にする。 */
 }

厳密にいえば、C言語系の場合、 アドレスを渡す場合も「アドレスという数値」を渡しているので値渡しなのですが、 イメージとして、例に上げています。念の為。






[ 赤い玉の画像 ] 「キーワード辞典」の目次へ

[ 黒板消しとチョーク受けの画像 ]