第8章 C言語の関数 ~ 関数の作り方とモジュール分け ~
— リスト21``–
#include <stdio.h> /** * 関数プロトタイプ宣言 */ void goukeiPrint(int tanka, int num); void main() { int tanka; int num; tanka = 2000; num = 4; goukeiPrint(tanka, num); tanka = 1500; num = 5; goukeiPrint(tanka, num); tanka = 3000; num = 2; goukeiPrint(tanka, num); } /** * 単価と個数から、合計を計算して表示する関数 */ void goukeiPrint(int tanka, int num) { printf("合計は、%dです。\n", tanka * num); }
どうですか? 今度はコンパイラに怒られることはなかったと思います。
赤字部分のおかけで、 Cコンパイラは後々になれば、関数 goukeiPrint があると信じてくれるのです。 これを、関数の宣言(フルネームですと、関数プロトタイプ宣言)と言います。
下に、正しい関数の宣言方法を説明します。
関数の宣言方法
戻り値の型 関数名( 引数の型と変数名, 引数の型と変数名 );
↓ ↓ ↓
例: void goukeiPrint(int tanka, int num);
実は、いつも #include ???> で指定している stdio.h ファイルや string.h ファイルには、printf や strcpy の関数宣言が記述されていたのです。 だから、今までそれらの関数を正しく使えていたのです(注21)。
では、次に引数の説明です。
関数を学習するときに、一番間違えやすいのが引数です。 難しいことですが、main 関数が渡した変数と、 関数 goukeiPrint が受け取った変数は、同じ値にはなりますが、 別々の変数なのです。リスト21を次のように変更してみてください。
— リスト21```–
#include <stdio.h> /** * 関数プロトタイプ宣言 */ void goukeiPrint(int Tanka, int Num); (1) void main() { int tanka; int num; tanka = 2000; num = 4; goukeiPrint(tanka, num); printf("変数tankaは書き変わる?tanka=%d\n", tanka); (2) tanka = 1500; num = 5; goukeiPrint(tanka, num); tanka = 3000; num = 2; goukeiPrint(tanka, num); } /** * 単価と個数から、合計を計算して表示する関数 */ void goukeiPrint(int Tanka, int Num) { (1)` printf("合計は、%dです。\n", Tanka * Num); Tanka = 500; (2)` }
まず、(1)と(1)`の部分を見てください。 goukeiPrint の引数の変数名が、tanka から Tankaに変わっていますね。 これでも、プログラムは問題なく動いているはずです。 しかし、まだこれだけでは、別々の変数であるかどうか、はっきりしませんね。
次に、(2)と(2)`の部分を見てください。 関数 goukeiPrint の中で、変数の中身を書き換えていますね。 main の中の変数 tanka と、関数 goukeiPrint の中の変数 Tanka が 同じ箱を指しているのであれば、(2)の部分で500と表示されるはずですね。
実行結果は、どうなりましたか?
たぶん、別々の変数であることが、はっきりとわかったことだと思います。 さらに念を押したい人は、二つの変数のアドレスを表示させてみてください。 それぞれの変数が、違うアドレスにあることがよくわかると思います。
ここで覚えていて欲しいことは一つです。 関数の中で、変数の中身を書き換えても、呼び出し元(ここではmain 関数)の 変数までは書き換わらないということです。
< 前のページへ 次のページへ >-
IS 559680 / ISO27001
認証範囲 本社、芝大門オフィス情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社、芝大門オフィス品質方針