関数の使い方(複雑な例)

プログラムを作っていると、2つ以上の値を返す関数を 使いたくなることがあるでしょう。 例えば、二つの値A, Bをいれて、大きい方の値をAとして返し、 小さい方の値をBとして返す場合などです。

普通に関数を使って書くことはできませんので、なんらかの抜け道が 必要となります。その抜け道として、よく用いられるものが、 6章で勉強した「ポインタ」です。ポインタとは変数の番地のことですから、 「変数の番地を関数に引き渡して、そこに直接値を書き込んでもらう」 ということを行っています。

具体的に、二つの変数A, Bを入れて、大きい方の値をAとして返し、 小さい方の値をBとして返すプログラムを書いてみましょう。 *とか&をどのような規則でつけたらよいかをよく吟味しながら、プログラムを 読んでください。わからないことがあったら、どんどんTAの人に聞いてください。


void maxmin( int *p, int *q)
{
  int r;
  if (*p<*q)
    {r=*p;
     *p=*q;
     *q=r;
   }
}

また、メインプログラムの方では、
maxmin(&A, &B);
などとしてやればいいでしょう。
次に配列を関数に引き渡してみましょう。6章で、「配列名」や「文字列名」は、 先頭要素へのポインタである、と習いました。 そのことを使うと、簡単に配列を関数へ引き渡すことができます。 例えば、以下のようなことができます。 このプログラムは、a[0]からa[n-1]までの値の合計を返す物です。

float sum(float a[],int n)
{
  int i;
  float s;
  s=0.0;
  for(i=0;i< n;++i){
    s+=a[i];
  }
  return (s);
}

また、メインプログラムでは、
x=sum(a, n);
などとしてやります。nを引数として渡す必要があることに注意しましょう。 その理由は、C言語では、配列のサイズがわからないので、 配列といっしょに要素数も渡してあげる必要があるからです。 なぜ、aに&がつかないのかを考えてみましょう。
prev index next