値渡し
関数呼出しの際に、引数の値を渡します。
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つ以上)の変数の値を、一つの関数で変更することができます。