配列の初期化

配列の初期化指定子は、中括弧 ({ }) で囲まれた定数式の、 コンマで区切られたリストです。初期化指定子の前には等号 (=) を付けます。 配列内のすべてのエレメントを初期化する必要はありません。配列が部分的に初期化されている場合は、初期化されていないエレメントの値は、該当の型の値 0 となります。 静的ストレージ期間を持つ配列のエレメントについても、同じことが言えます。 (静的ストレージ期間を持つのは、static キーワードを指定して宣言されているすべてのファイル・スコープ変数および関数スコープ変数です。)

配列の初期化指定子は、次の 2 とおりの方法で指定できます。
  • C89 スタイルの初期化指定子の場合、配列エレメントは添え字順に初期化 しなければなりません。
  • 指定された 初期化指定子を使用すると、初期化する添え字エレメントの値を指定することができ、配列エレメントを任意の順序で初期化することができます。指定された初期化指定子について は、集合体型に対する、指定された初期化指定子 で詳しく説明しています。
次の定義では、C89 スタイルの初期化指定子を使用して、完全に初期化され る 1 次元の配列を示しています。
static int number[3] = { 5, 7, 2 };
配列 number には、次の値が含まれます。すなわち、number[0]5number[1]7number[2]2 です。エレメントの数 (この例では、3) を定義する添え字宣言子の中で式を使用する場合、配列のエレメントの数よ り多い初期化指定子を使用することはできません。
次の定義は、一部のみが初期化される 1 次元配列を示しています。
static int number1[3] = { 5, 7 };
number1[0] および number1[1] の値は前の定義 のときと同じですが、number1[2]0 です。
次の定義では、明示的に初期化しない配列のエレメントをスキップオーバーするための、 指定された初期化指定子の使用法を示しています。
static int number[3] = { [0] = 5, [2] = 7 };
配列 number には、次のような値が入れられます。すなわち、 number[0]5number[1] は暗黙的に 0 に初期化され、number[2]7 です。
添え字宣言子の式でエレメントの数を定義する代わりに、次の 1 次元配列定義では、 指定された各初期化指定子に対して 1 つのエレメントを定義します。
static int item[ ] = { 1, 2, 3, 4, 5 };
サイズが指定されておらず、5 つの初期化指定子があるので、コンパイラーは item に、初期化された 5 つのエレメントを与えます。

文字配列の初期化

次のものを指定して、1 次元の文字配列を初期化できます。
  • 中括弧で囲まれ、コンマで区切られた定数のリスト。各定数は、文字に含めることができます。
  • ストリング定数 (定数を囲む中括弧はオプション)

ストリング定数を初期化すると、空いている場所がある場合または配列の次元が指定されていない場合は、 NULL 文字 (¥0) をストリングの終わりに入れます。

以下の定義は、文字配列の初期化を示します。
   static char name1[ ] = { 'J', 'a', 'n' };
   static char name2[ ] = { "Jan" };
   static char name3[4] = "Jan";

以下の定義では、次のエレメントを作成します。

エレメント エレメント エレメント
name1[0] J name2[0] J name3[0] J
name1[1] a name2[1] a name3[1] a
name1[2] n name2[2] n name3[2] n
    name2[3] ¥0 name3[3] ¥0
次の定義では、NULL 文字は なくなります。
   static char name3[3]="Jan";

多次元配列の初期化

次の方法のいずれかにより、多次元配列を初期化できます。
  • 初期化するすべてのエレメントの値を、コンパイラーが値を割り当てる順序で リストする。コンパイラーは、最後の次元の添え字を最も速く増やして、 値を割り当てます。この形式の多次元配列の初期化は 、1 次元配列の初期化と似ています。次の定義では、配列 month_days を完全に初期化します。
       static month_days[2][12] =
       {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
        31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
       };
  • 中括弧を使用して、初期化するエレメントの値をグループ化する。 各エレメントかエレメントのネスト・レベルを中括弧で囲むことができます。 次の定義には、第 1 次元の 2 つのエレメントが含まれます (これらのエレメントは、行と見なすことができます)。 初期化には、これらの 2 つの各エレメントを囲む中括弧が含まれます。
       static int month_days[2][12] =
       {
        { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
        { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
       };
  • ネストされた中括弧を使用して、次元および次元のエレメントを選択的に初期化する。次の例では、配列 grid の最初の 8 つのエレメントのみが、明示的に初期化 されます。明示的に初期化されない残りの 4 つのエレメントは、自動的にゼロに初期化されます。
          static short grid[3] [4] = {8, 6, 4, 1, 9, 3, 1, 1};
    grid の初期値は、次のとおりです。
    エレメント エレメント
    grid[0] [0] 8 grid[1] [2] 1
    grid[0] [1] 6 grid[1] [3] 1
    grid[0] [2] 4 grid[2] [0] 0
    grid[0] [3] 1 grid[2] [1] 0
    grid[1] [0] 9 grid[2] [2] 0
    grid[1] [1] 3 grid[2] [3] 0
  • 指定された 初期化指定子の使 用。以下の例は、指定された初期化指定子を使用して、配列の最後の 4 つのエレメントだけを明示的 に初期化します。明示的に初期化されない最初の 8 個のエレメントは、自動的にゼロに初期化されま す。
    static short grid[3] [4] = { [2][0] = 8, [2][1] = 6,
                                 [2][2] = 4, [2][3] = 1 };
    grid の初期値は、次のとおりです。
    エレメント エレメント
    grid[0] [0] 0 grid[1] [2] 0
    grid[0] [1] 0 grid[1] [3] 0
    grid[0] [2] 0 grid[2] [0] 8
    grid[0] [3] 0 grid[2] [1] 6
    grid[1] [0] 0 grid[2] [2] 4
    grid[1] [1] 0 grid[2] [3] 1