5.1 配列
5.1.1 値の列
何らかの情報を一時的に保存する手段として、プログラムは変数を使うことができました。しかし、例えば 10 通りの情報を保存するために、変数をわざわざ 10 個も宣言するのは極めて面倒であり、それらを全て管理するのは大変なことでしょう。もし、数千、数万の値を変数に保存させたい場合に、全ての変数を宣言するというのは馬鹿げています。そこで、特定のデータの集合やデータの列は配列という形でまとめて管理、制御することができます。
配列は同じ型の同じ変数名で、複数の記憶領域を確保するものです。これらの変数リストの数はプログラマが自由に指定することができ、それぞれの配列の値を要素と呼びます。配列を宣言するためには配列宣言子を用います。配列宣言子では、変数名と要素の数を次のように指定します。
変数名[要素数]
要素数には、配列のサイズを 0 以上の整定数で指定します。配列宣言子を用いて宣言された変数は、指定された要素数分の値を保存する領域を連続して確保します。列車のようにいくつもの車両がつながっている状態を想像してくれればよいでしょう。次は、もっともシンプルな配列である、数値型の1 次元配列の宣言です。
int iArray[2];
要素数を指定することを除いて、通常の変数の宣言と変わりはありません。この宣言では int 型の iArray 配列変数が作成され、その配列は iArray[0] と iArray[1] という領域を持ちます。iArray[1] の [1] という要素番号の指定を添字と呼びます。
C言語では、添字は 0 番から数えます。宣言のときに指定した数は個数であり、int iArray[2] で実際に作成される配列は 0 番と 1 番の 2 つであることを忘れないで下さい。添字は必ず括弧 [ ] で囲みます。定義された配列は、次の図1のような連続した記憶領域を持ちます。
要素を 2 つ持つ int 型の配列変数は、int 型の通常の変数 2 つ分と同じサイズです。配列は添字を指定して個々の要素にアクセスできるため、繰り返し処理などで、一括して変数を処理することができるという大きな利点があります。添字には整定数だけではなく、数値変数を指定することも可能なのです。ただし、配列宣言子で要素数を指定するときは、必ず定数でなければなりません。
#include <stdio.h> int main() { int iArray[3]; iArray[0] = 10; iArray[1] = 100; iArray[2] = 1000; printf("%d : %d : %d\n" , iArray[0] , iArray[1] , iArray[2]); return 0; }
コード1は 3 つの数値を保存する手段として、個別の数値型変数を使うのではなく、配列を使っています。このプログラムの iArray 変数はメモリ上では次のような構造になっています。
このように、iArray 変数は連続した保存領域を持ち、各領域に保存されている要素にアクセスするには、添字による番号で指定するのです。コード1では、iArray[0] に値 10 を、iArray[1] に 100 を、iArray[2] に 1000 を格納しています。
添字は変数で指定することもできるため、配列を用いることで大量のデータを一括して処理することができます。多くの場合、配列は繰り返し処理によって効率的に処理されます。
例えばビットマップはピクセル単位にカラー情報を持っており、これらの情報を個別の変数で表すことはできません。各ピクセル情報を配列として管理すれば、ビットマップ全体に繰り返し文を使った一括処理を実現することができます。データベースや音声データでも同様のことが言えます。こうした大量の情報は、配列としてまとめて処理します。
#include <stdio.h> int main() { int iArray[5] , iCount , iAnswer; for(iCount = 0 ; iCount < 5 ; iCount++) { printf("iArray[%d] : 値を入力してください>" , iCount); scanf("%d" , &iArray[iCount]); } for(iCount = 0 , iAnswer = 0 ; iCount < 5 ; iCount++) iAnswer += iArray[iCount]; printf("iArray の総和 = %d\n" , iAnswer); return 0; }
このプログラムは、5 つの要素を持つ iArray 配列変数を定義し、これをユーザーからの入力で初期化します。次に、iArray 配列の各要素を iAnswer に加算代入することで、配列の総和を取得します。最後に、iArray 変数の総和を表示します。for 文を使って配列を処理する時に、 iArray[iCount] というように、変数で添字を指定していることに注目してください。