C言語の関数にデータを渡す方法にはいくつか方法がありますが、特に重要なデータ渡しの方法が二つあります。
一つは「値によるデータ渡し」、もう一つは「参照によるデータ渡し」です。
そこで今回のC言語超入門では、「値によるデータ渡し」と「参照によるデータ渡し」について、ご説明いたします。
値によるデータ渡し
値によるデータ渡し(Call by value)とは、C言語において関数へのデータ渡し方法として、最も一般的な方法と言ってもよいでしょう。
以下のプログラム1は、変数xの値をfx_teest()関数に渡して、変数yに代入しています。
/* プログラム1 */ #include <stdio.h> int fx_test(int); int main() { int x = 10; printf("fx_test(x) = %d\n", fx_test(x)); printf("x = %d\n", x); } int fx_test(int y) { y = y * 2; return y; } ※プログラム1の実行結果 fx_test(x) = 20 x = 10
このとき、変数x、変数yは、それぞれ独立した存在であることが、値によるデータ渡しの特徴です。
この、変数x、変数yが、それぞれ独立した存在である、という特徴がよく分かるよう、
プログラム1を書き換えたのが、次のプログラム2です。
/* プログラム2 */ #include <stdio.h> int fx_test(int); int main() { int x = 10; printf("fx_test(x) = %d\n", fx_test(x)); printf("x = %d\n", x); } int fx_test(int x) { x = x * 2; /* 変数xの値を書き換える */ return x; } ※プログラム2の実行結果 fx_test(x) = 20 x = 10
プログラム2では、プログラム1の変数yを変数xに変更して、関数fx_test()内で、変数xの値を書き換えています。
fx_test()関数内で、変数xの値を書き換えていますが、printf()関数で変数xの値を出力した結果をみますと、
変数xの値は元のまま(変数の値が書き換えられていない)であることが分かります。
参照によるデータ渡し
関数にデータを渡す方法として先に紹介しました、値によるデータ渡しの他に、参照によるデータ渡しを使うこともできます。
参照によるデータ渡しは一般的に、配列データを関数に渡すときに使用します。
参照によるデータ渡しでは、いったい何を「参照」しているのかといいますと、データのアドレスです。
データのアドレスとは、データがコンピューターのどこに存在するのかを区別するための情報で、名前のとおり、コンピューター上の住所のようなものです。
もし参照によるデータ渡しができず、値によるデータ渡しだけで配列データを関数に渡すとしたら、とても大変です。
例えば配列要素数が100個ある変数を関数に渡したいとき、値によるデータ渡しですと、100個も変数を代入しなければなりません。
参照によるデータ渡しでは、変数のアドレスを渡して、その後のデータの取り扱いは関数側に任せることで、シンプルなデータ渡しの記述を実現しています。
以下のプログラム3は、文字配列mojiを、参照によるデータ渡しで、関数fx_test()に渡しています。
/* プログラム3 */ #include <stdio.h> void fx_test(char moji[]); int main() { char moji[]="Windows"; fx_test(moji); } void fx_test(char moji[]) { printf("moji[] = %s\n", moji); return; } ※プログラム3の実行結果 moji[] = Windows
参照によるデータ渡しは、関数へのデータ渡しをシンプルに記述することができる一方で、
データを受け取った関数側では、受け取った変数のデータサイズ(配列要素数)を知ることができません。
したがって参照によるデータ渡しを使う場合は、プログラマーが、データサイズを意識してプログラミングをする必要があります。
例えば、参照によるデータ渡しで文字列を受け渡しするときであれば、文字列の最後にはゼロ(NULL文字)であるというルールを使って、データサイズを把握することができます。
(参考:【C言語超入門(第15回)】配列の表現方法と文字列表現方法を学ぼう)
C言語超入門の第32回まとめ
今回のC言語超入門では、C言語の関数にデータを渡す方法として、特に重要なデータ渡しの方法である「値によるデータ渡し」と「参照によるデータ渡し」をご紹介しましたが、いかがでしょうか。
C言語では、「値によるデータ渡し」と「参照によるデータ渡し」の他にも、関数にデータを渡す方法があります。
でも、特に重要なこの二つの方法を、まずはしっかりとマスターすることが大切です。
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。