【問題13】「関数に配列を渡す」とは何か完全マスター! 組み込みC言語プログラミング(14)(2/3 ページ)

» 2014年12月02日 11時00分 公開
[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]

配列の渡しかた

 問題13は「1月から12月までの小遣いの支出金額が格納されているintの配列を関数に渡し、最も支出の多い月を求める」ものでした。pocket_money.cで、そのための関数がmax_value_indexです。

 max_value_index は自作の関数なので、まず関数を宣言します。3行目の

int max_value_index(const int []);

 が関数のプロトタイプ宣言で、max_value_indexの引数はintの配列で、intの値を返すことをCコンパイラに知らせます。

 C言語の配列は、ブラケット([])で表します。max_value_indexの関数宣言では、intの後ろにブラケットを記述することで、引数がintの配列であることを表しています。ちなみに、ここでは配列の大きさを記述しません。

 7行目の

int moneies[12] = {3100,2900,3100,3000,3100,3000,3100,3100,3000,3100,3000,4000};

 では、1月から12月までの小遣いの支出金額が格納されているintの配列「moneies」を宣言しています。ただし、C言語の配列では添字は0から始まるため、1月の支出金額は、moneies[0]に入ります。つまり1月からの支出金額は、月から1引いた部分に入ることになります。

 9行目には、max_value_indexの関数呼び出しが書かれています。配列を引数として呼び出すときは、

max_value_index (moneies)

 のように、引数に配列の名前だけを記述します。max_value_indexは配列要素の最大値の添字を返すので、1加えることで支出の最も多かった月が求まります。

仮引数でポインタを受け取る

 今度は12行目から18行目、max_value_indexの関数定義に着目してみます。仮引数に配列を受け取るときは、12行目の

int max_value_index (const int v[])

 のように、仮引数の後ろにブラケットを書いて、intの配列であることを示します。ここでも配列の大きさ(要素数)は記述しません。

 さて、max_value_indexを呼び出す際に、引数へ配列の名前を記述しました。「配列の名前はその配列の先頭ポインタ」なので、max_value_indexにはポインタが渡されることになります。ポインタは「何か(オブジェクト)を指し示すデータ」なので、vにはmoneiesの先頭ポインタが渡されます。するとvはmain関数のmoneiesにつながります。

photo max_value_index関数のvは、main関数のmoneiesにつながる

 max_value_indexでvの要素を参照するとき、すなわち16行目の

v[i]

 や

v[imax]

 は、実はmain関数のmoneiesの要素を見ていることに気付かなればなりません。

 まとめると、

  • 関数に配列を渡すときは、配列の値そのものを渡しているわけではなく、配列の先頭ポインタを渡している。
  • 呼び出された関数では、仮引数に渡されたポインタから、元の配列を参照している。

 ことになります。

 最後にconst型修飾子について説明しましょう。

 配列の型宣言でconstを記述すると、その配列の要素を変更できなくなります。例えばmax_value_indexで、

v[i] = 0;

 と書くと、vの要素にゼロを代入することは、、main関数のmoneiesの要素にゼロを代入することなので、うっかりデータが破壊されてしまうことが生じます。constを付けるとコンパイラはこのような操作を許しません。

Copyright © ITmedia, Inc. All Rights Reserved.