配列初期化子

配列の宣言時に、配列の各要素の値を初期化することができます。基本的な指定方法は変数の初期化と同じですが、各要素の値をカンマ , で区切った初期化子並びを大括弧 { } で囲んだ初期化子を指定しなければなりません。

{ 初期化子, 初期化子, 初期化子, 初期化子 ... }

初期化子並びで指定する各初期化子は、先頭から順に配列の要素の値となります。初期化子の数は、配列のサイズを越えてはなりません。初期化子の個数が配列の要素数に満たない場合、残りの要素は0で初期化されます。

int型の配列を宣言すると同時に、その要素の値を初期化する場合は、次のようになるでしょう。

int items[3] = { 0, 1, 2 };

上記の場合、items[0] 要素は 0、items[1] 要素は 1、items[2] 要素は2で初期化されます。この配列の要素数は 3 なので、指定できる初期化子の数は 3 つまでです。初期化子の数が配列の要素数よりも多いとコンパイルエラーになります。

サンプル03

#include <stdio.h>

int main(void)
{
    int i, items[5] = { 50, 100, 150, 200, 250 };

    for(i = 0 ; i < 5 ; i++)
        printf("items[%d]=%d\n", i, items[i]);

    return 0;
}

実行結果

サンプル03の実行結果

サンプル03は、宣言と同時に初期化子を用いて配列を初期化しています。for文を使って配列の各要素の値を出力すると、初期化子に指定した値が、正しく配列の要素に設定されていることが確認できます。

宣言と同時に配列を初期化する場合、初期化子の数から要素の数を推測することができます。そのため、配列の宣言が初期化子を持つ場合、配列宣言子の [ ] 内に指定する定数式を省略することができます。定数式を省略した場合、配列のサイズが不明な不完全な型となります。この場合、初期化子を指定しなければコンパイルエラーとなります。

int items[]; /*サイズが不明なのでコンパイルエラー*/
int items[] = { 0, 1, 2, 3 }; /*初期化子からサイズを決定*/

上記のように、配列の宣言と同時に初期化する場合は、配列の要素数を省略することもできます。ただし、仕様で配列のサイズが固定されている場合、配列宣言子で明示的に配列のサイズを指定した方が確実です。そうでなければ、初期化子の数が間違っている場合や、後に書き換えられたときに不要なバグを生み出す可能性を残してしまいます。逆に、頻繁に配列のデータを書き換える可能性がある場合は、サイズを省略した方が便利になります。後述する文字配列などに適した記法です。

サンプル04

#include <stdio.h>

int main(void)
{
    int i, items[] = { 10, 20, 30, 40, 50 };

    for(i = 0 ; i < 5 ; i++)
        printf("items[%d]=%d\n", i, items[i]);

    return 0;
}

実行結果

サンプル04の実行結果

サンプル04は、サイズが指定されていない配列items を宣言しています。初期化子並びに指定された値の数から、自動的に配列のサイズが決定されます。配列のサイズは省略していますが、初期化子を指定しているので、正しくコンパイルできます。