配列宣言子には、ID と、その後に続く、オプションの添え字宣言子 が含まれています。アスタリスク (*) が前に付く ID は、ポインターの配列です。
>>-[--+-+---------------------+--+-----------------------+-----+--]--> | '-type_qualifier_list-' '-assignment_expression-' | +-static--+---------------------+--assignment_expression-+ | '-type_qualifier_list-' | +-type_qualifier_list--static--assignment_expression-----+ '-+---------------------+--*-----------------------------' '-type_qualifier_list-' >--+-------------------------------+--------------------------->< | .---------------------------. | | V | | '---[--constant_expression--]-+-'
ここで、constant_expression は、配列サイズを示す定数整数式です。これは正でなければいけません。
宣言をブロックまたは関数スコープに表示する場合は、非定数式
を配列添え字宣言子に指定することができ、その配列は可変的に変更される型として見なされます。
配列添え字演算子のブラケット内のアスタリスクは、サイズ指定のない可変長配列を示します。
この場合、配列は、定義ではない関数宣言 (つまり、関数プロトタイプ・スコープを使用した宣言)
でのみ使用できる、可変的に変更される型と見なされます。
添え字宣言子は、配列の次元の数と各次元のエレメントの数を記述します。大括弧で囲まれた式、または添え字は、別の次元を表し ます。これらは、定数式でなければなりません。
次の例では、char 型が指定された 4 つのエレメントを 含む 1 次元配列を定義します。
char list[4];
各次元の 1 番目の添え字は、0 です。配列 list には以下のエレメン トが含まれます。
list[0] list[1] list[2] list[3]
次の例では、int 型の 6 つのエレメントを含む 2 次配列を定義します。
int roster[3][2];
多次元配列は、行方向優先順序で保管されます。 エレメントが、保管場所の昇順で参照される場合、一番後の添え字が一番先に変わります。 例えば、配列 roster のエレメントは、以下の順序で保管されます。
roster[0][0] roster[0][1] roster[1][0] roster[1][1] roster[2][0] roster[2][1]
ストレージ内では、roster のエレメントは、以下のように保管されます。
* * * *---------------*---------------* --------------* ^ ^ ^ * * * roster[0][0] roster[0][1] roster[1][0]
以下の場合には、最初の (最初のみ) 添え字の大括弧のセットを空にしたままにすることができ ます。
最初の添え字の大括弧のセットを空にした配列定義では、初期化指定子が最初の次元のエレメン トの数を決めます。1 次元配列では、初期化されたエレメントの数が、エレメントの合計数になります。多次元配列は、初期化指定子を添え字宣言子 と比較し、第 1 次元のエレメントの数を決めます。
関連参照