初心者には以外と難しい「値渡し(Call by Value)」と「参照渡し(Call by Reference)」
C言語では関数に複数の引数(Parameter)を渡すことができます。
引数の2つのタイプ
引数(Parameter)の渡し方には2種類あり、その値そのものを渡す「値渡し(Call by Value)」とその変数への参照(アドレス)を渡す「参照渡し(Call by Reference)」があります。
2つの違いには「値渡し(Call by Value)」は渡された関数内で値を変更しても呼び出し元の変数には影響は与えませんが、「参照渡し(Call by Reference)」は呼び出し元の変数に影響を及ぼします。
利用例
初心者の頃はこの違いがよくわからず予期せぬ不具合に見舞われました。
以下のサンプルではsub()関数への1つ目の引数が「値渡し(Call by Value)」で2つ目の引数が「参照渡し(Call by Reference)」です。
#include <stdio.h> int main( void ) ; int sub( int, int * ) ; int main() { int i = 10 ; int j = 100 ; int ret ; ret = sub( i, &j ) ; printf( "ret = %dn", ret ) ; printf( "i = %dn", i ) ; printf( "j = %dn", j ) ; getch() ; } int sub( int a, int *b ) { a += 10 ; //10を足しても呼び出し元には影響しません *b += 100 ; //100を足すと呼び出し元にも100が足されます。 return 0 ; }
実行結果は
ret = 0 i = 10 j = 200
となり、「値渡し(Call by Value)」で渡されたものは呼び出し元に影響を与えませんが、「参照渡し(Call by Reference)」で渡されたものは呼び出し元に影響を与えることができます。
関数は1つしか戻り値を持てませんが、「参照渡し(Call by Reference)」を使うことで複数の変数への影響を与えることが可能になります。