プログラミング(4)「関数」

関数

C言語のプログラムは関数の集まりで出来ています。 普通は関数というと y = f ( x ) という数学の関数が思い浮かびますが、 C言語の関数は数学の関数と少し違っています。 数学での関数はある値 x を与えると、 それに対応する計算を行って y という値が得られます。 C言語の関数は、ある値を与えるとその関数固有の処理を行って値を返します。 与える値を引数(ひきすう)、返ってくる値を返り値や戻り値と呼びます。

C言語の関数が数学の関数と違うのは、 引数や戻り値のない関数も作れるということです。 つまり、値は返さずに関数固有の処理だけ行うためにも関数が使われます。

また、C言語の main 関数は特別な意味を持っていて、 プログラムはこの main関数から実行が行われます。

関数の書式は

戻り値の型 関数名(引数)
{
  処理
}

となっています。


関数の作成

例えばある数の自乗を求める関数は

double jijo(double x)
{
  return x*x;
}

と書くことが出来ます。ついでに得られた値の表示も関数内で行いたいときは

double jijo(double x)
{
  double y;
  y = x*x;
  printf("%f\n",y);
  return y;
}

と書けます。C言語の特徴として値を返さない関数も作れるので、 表示だけ行う関数も作ることが出来て

void jijo(double x)
{
  double y;
  y = x*x;
  printf("%f\n",y);
}

と書けます。引数や戻り値がない場合は void を使います。

実際に関数を呼び出すサンプルを作ってみます。

#include <stdio.h>
double jijo(double x)
{
  return x*x;
}
main()
{
  double x,y;
  x = 4.0;
  y = jijo(x);
  printf("%f の自乗は %f\n",x,y);
}

このプログラムの実行結果は

> jijo
4.000000 の自乗は 16.000000

となります。

また、関数を使って次のようなプログラムも作ることが出来ます。

#include <stdio.h>
void hello(void)
{
  printf("Hello, World!\n");
}
main()
{
  hello();
}

関数helloは引数も戻り値もない関数で、文字の表示だけを行います。 このように特定の処理だけをする関数も作れます。


複数の引数

関数は複数の引数を持つことが出来ます。

double wa(double x, double y)
{
  return x + y;
}

また、配列変数を引数にすることも出来ます。

double wa(double x[10])
{
  int i;
  double wa;
  wa = 0;
  for(i = 0; i < 10; i++){
    wa += x[i];
  }
  return wa;
}
演習
上記の和を求める関数を利用して、 1から10までの和を求めるプログラムを作成せよ。

引数の値の変更

関数を呼び出すときに使用する引数の値を関数内で変更した場合、 引数の値が変更されるかどうかは引数の渡し方に依存します。

#include <stdio.h>
void func(int i)
{
  i = 2;
}
main()
{
  int i = 1;
  func(i);
  printf("i = %d\n",i);
}

上記の例の場合結果は

i = 1

となります。 これは関数に i の値を渡しただけなのでこのような結果となります。

#include <stdio.h>
void func(int *i)
{
  *i = 2;
}
main()
{
  int i = 1;
  func(&i);
  printf("i = %d\n",i);
}

この結果は

i = 2

となります。int *i の * はポインタを表す演算子で、 変数の値ではなく変数の入れ物を受け取ることを意味します。 呼び出すときも &iと書いて、 変数の値ではなく変数の入れ物を渡すように指示します。

配列を引数にする場合も実はポインタを渡しています。 従って関数内で値を変更した場合は、引数の値も変更されます。

#include <stdio.h>
void func(int v[4])
{
  int i;
  for(i = 0; i < 4; i++){
    v[i] *= 2;
  }
}
main()
{
  int i;
  int value[4];
  for(i = 0; i < 4; i++){
    value[i] = i;
  }
  func(value);
  for(i = 0; i < 4; i++){
    printf("%d\n",value[i]);
  }
}
の結果は
0
2
4
6

となります。 このように、関数内で値を変更できることを利用して、 戻り値が複数あるような関数も作ることが出来ます。