配列型(array type)は,要素数(サイズ)と要素の型(要素型,element type)の2つで特徴化されるデータ型です。要素型は型指定子で指定し,要素数(サイズ)は宣言子に配列宣言子を用いて指定します。
■配列宣言子(Array Declarator)
識別子[サイズ]
例えば,
double x[5];
といった宣言の場合,要素型は double
,配列宣言子は x[5]
です。この結果,要素数 5
の「double
の配列(array of double
)」あるいは「double
型配列」が出来上がります。個別要素は,x[0]
から x[4]
までの5個であり,すべて double
型のオブジェクトです。
配列型は要素型からの派生型であり,後に学ぶ構造体型と同じように「集成体型」(集合体型,aggregate type)に属します(3.3 参照)。集成体型の初期化には,{ }
で囲んだ初期化子を使います[C11(旧C99)§6.7.9, 16]。 例えば,次の宣言の場合,
double x[5] = {1.5, -0.2, 4.7};
{1.5, -0.2, 4.7}
が初期化子であり,x[0] = 1.5
,x[1] = -0.2
,x[2] = 4.7
,そして残りの x[3]
と x[4]
は 0
と初期化されます。初期化子に要素数よりも少なく値を指定すると,残りには 0
が入ります[C11(旧C99)§6.7.9, 10 & 21]。
/* Example 9.1 */ #include <stdio.h> int main(void) { int m[10] = {3, 7, 10}; int i; printf("sizeof(int) = %td\n" "sizeof(m) = %td\n\n", sizeof(int), sizeof(m)); for(i = 0; i < 10; i++) printf("m[%d] = %d\n", i, m[i]); return 0; }
要素数 10 の int
型配列です。配列宣言子は m[10]
,初期化子が {3, 7, 10}
です。最初の要素が m[0]
,2つ目の要素が m[1]
,以下 m[9]
までの10個の int
型変数 m[i]
(i = 0, 1,..., 9
)が連なる配列です。実行すると,
sizeof(int) = 4 sizeof(m) = 40 m[0] = 3 m[1] = 7 m[2] = 10 m[3] = 0 m[4] = 0 m[5] = 0 m[6] = 0 m[7] = 0 m[8] = 0 m[9] = 0
となります。初期化において要素数よりも少なく値を指定すると,仕様(旧C99,現C11)通り,残りには 0
が入っていることも確認できます。
配列はデータを一括処理するための工夫です。例えば,次のようなデータをも扱えます。
項目 A B C データ1 1 2 3 データ2 10 11 12
この場合,2×3のデータになります。このようなデータを処理するためのものが「多次元配列」です。
■多次元配列の宣言
型 配列名[サイズ1][サイズ2];
/* Example 9.2 */ #include <stdio.h> int main(void) { int n[2][3] = { {1, 2, 3}, {10, 11, 12} }; int i, j, sum; // 行の和 for(i = 0; i < 2; i++) { sum = 0; for(j = 0; j < 3; j++) { sum += n[i][j]; printf("%d\t", n[i][j]); } printf("| %d\n", sum); } printf("------------------------+\n"); // 列の和 for(j = 0; j < 3; j++) { sum = 0; for(i = 0; i < 2; i++) { sum += n[i][j]; } printf("%d\t", sum); } printf("\n"); return 0; }
これは,n[0] = {1,2,3}
と n[1] = {10,11,12}
という2つの配列(2次元配列)を作ります。個別要素は,n[0][0] = 1, n[0][1] = 2, n[0][2] = 3
といった具合です。
実行結果です。
1 2 3 | 6 10 11 12 | 33 ------------------------+ 11 13 15
各行,各列の和が求まっています。