値渡しと参照渡し

[ つぎ | うえ ]

値渡し

関数呼出しの際に、引数の値を渡します。

int func(int arg1, int arg2)
{
    int r;
    r = arg1+arg2;
    return r;
}

int main()
{
    int rr;
    rr = func(5,6);
    printf("5 + 6 = %d\n",rr);
    return 0;
}

このプログラムの例では、関数呼出し func( 5, 6 )の際に、整数値 5と整数値6 をそれぞれ、arg1、arg2 に対応して受渡されます。このように、C 言語では、常に、値渡し(call by value)によって関数呼び出しが行われます。


参照渡し

値渡しに対して、常に、変数への参照(先頭番地)を受渡す参照渡し(call by reference)という方法を採用するプログラミング言語もあります。科学技術計算用プログラミング言語Fortran などです。

しかし、C言語でも参照(番地)をその値として呼出し側の関数に受渡すことができます。そのために&演算子を用います。

関数で計算した値を返す場合は、通常、一つの値しか返すことができません。そのため、この参照渡しと同じ方法を用いて工夫をすることができます。例えば、

void func(int arg1)
{
    arg1++;
    return;
}

int main()
{
    int a=3;
    func(a);
    printf("a = %d\n",a);;
    return 0;
}

このプログラムを実行し、func関数呼出し func(a) を実行しても、整数型変数a の値は変わりません。しかし、
変数 a の番地を func に受渡すように書き換えます。

void func(int *arg1)
{
    (*arg1)++;
    return;
}

int main()
{
    int a=3;
    func(&a);
    printf("a = %d\n",a);;
    return 0;
}

このように、func 関数には番地を受渡し、func 関数の中では、(その)番地が指している先の変数を操作します。この方法により、main 関数の変数の値を直接、変更することができます。

この方法を使えば、複数(2つ以上)の変数の値を、一つの関数で変更することができます。


[ つぎ | うえ ]
yasu@i.hosei.ac.jp