第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 関数)の 変数までは書き換わらないということです。

< 前のページへ

Pagetop