法大奥山研究室

 previous  contents

9.1. 配列宣言子


 配列型(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.5x[1] = -0.2x[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

各行,各列の和が求まっています。


 previous  contents