【問題13】「関数に配列を渡す」とは何か:完全マスター! 組み込みC言語プログラミング(14)(2/3 ページ)
C言語の関数呼び出しでは、まず引数(実引数)の値を求め、その値を呼び出す関数の仮引数に代入し、その後、関数に制御が移ります。では、「関数に配列を渡す」際にはどうなっているのでしょうか。
配列の渡しかた
問題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につながります。
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.