配列の復習
配列の宣言
型 変数名[要素数] = {初期化列}; // {初期化列}は省略してよいが、その場合は初期値不定になるよ float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};
宣言された配列は、メモリ上で必ず連続して並ぶ(変数のアドレスが連続している)
また、[]演算子を用いることによって、配列の先頭から番号を付けて要素にアクセスすることができる。
float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};
farray[0] ~ farray[4]ができる
farray[0]:1.0
farray[1]:2.0
farray[2]:3.0
farray[3]:4.0
farray[4]:5.0
farray[0], farray[1], farray[2], farray[3], farray[4]それぞれは、普通に宣言した変数と同じで特に何の変哲もない
float a=1.0, b=2.0, c=3.0, d=4.0, e=5.0; float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};
添え字でアクセスできること以外は、a,b…で宣言した変数と「性質は何も変わらない」よ。
関数の復習?
floatの引数を2個とって、その和を返す関数を作ります。
//floatの値を2つ足して返す関数 float fadd(float _a, float _b)//_a, _bは仮引数 { return(_a + _b); }
これは、特に説明いらないよね。
mainでこの関数を使うには、
//プロトタイプ宣言 //floatの引数を2個とって、その和を返す関数 float fadd(float _a, float _b); int main() { float a=12.3, b=3.14;//実引数として渡す値 float c; //返す値を生成する、作業用の変数 c = fadd(a, b); //a,b 実引数 c = fadd(12.3, 3.14); //実引数は、値に置き換わり、仮引数にコピーされる c = 15.44; 15.44<=fadd(12.3, 3.14) 15.44を返してるので rerturn 0; }
参考:値渡しと参照渡し
関数に配列の「要素」をわたす
上で書いたように、配列の個々の要素farray[2], farray[4]などは、float a,b;のように宣言された変数と何ら変わりはありません。
なので、実引数として関数に渡すのは簡単です。
c = fadd(farray[2], farray[4]); //c = fadd(3.0, 5.0); farray[2],farray[4]が値に置き換わり、仮引数に値がコピーされる
これは、特に問題なくできると思います。
プログラムを作ってるとやりたくなるのが、配列の全要素を関数内で参照するってやつ
関数に配列の「先頭アドレス」をわたして関数内で配列の要素にアクセスしまくる
たとえば、「5個の要素を持つ配列farrayの和を返す関数を作りたいなぁ」とか。
何度か説明している通り、関数に、「引数を使って、配列全体を渡す」というエキセントリックなことはできません。
じゃあどうしますか?
//全部は渡せないから、こうする? float sumf(float _a,float _b,float _c,float _d,float _e){省略} float sum = sumf(farray[0],farray[1],farray[2],farray[3],farray[4]);
こんな関数作りますか?
要素数5個ぐらいだといいけど、100個とか200個とか要素あったらすごいことになるよね。。。
- 引数経由では、配列全体を関数に渡すことはできない
- 代わりの策として、配列の先頭のアドレスを渡して、添え字でアクセスすることで全体にアクセスできる
- ただし、配列がどこまで続いているかは、アドレスだけからはわからないので、配列数も一緒に渡す必要がある
- 難しいから、パターン学習で覚えちゃってもいいと思う。
例)
//宣言と定義では普通にに配列だよということで書ける float sumf(float _array[], int _size) { float _sum = 0.0; for(int i=0; i< _size; i++) { _sum = _sum + _array[i]; } return(_sum); }
使うときは、こんな感じ
int main() { float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0}; float sum; //配列名と配列数を指定する sum = sumf(farray, 5); }