添字式には、次のように複数の添字がある場合があります。
expression1 [ expression2 ] [ expression3 ] /*...*/ ;
添字式は、左から右へ関連付けられます。 左端の添字式、expression1[ expression2 ]
が最初に評価されます。 expression1
と expression2
を加算した結果として得られるアドレスからポインター式が形成され、次にこのポインター式に expression3
が加算されて新しいポインター式が形成されます。このようにして、最後の添字式が加算されるまで処理が行われます。 間接演算子 (*
) は、最終的なポインター値が配列型のアドレスを指していない限り、最後の添字式が評価された後で適用されます。
複数の添字を含む式は、"多次元配列" の要素を参照します。多次元配列は、その要素が配列である配列です。 たとえば、3 次元配列の最初の要素は 2 次元配列です。
使用例
以下では、その後の各例で使用するために、prop
という名前の配列を宣言しています。この配列には 3 つの要素があり、各要素は int
値の 4 × 6 配列になっています。
int prop[3][4][6];
int i, *ip, (*ipp)[6];
prop
配列を参照するときには、次のようになります。
i = prop[0][0][1];
この例は、prop
の個々の int
要素の 2 番目を参照する方法を示しています。 配列は行ごとに格納されるので、最後の添字が最も速く変化します。そのため、たとえば配列の次の (3 番目の) 要素を参照する式は、prop[0][0][2]
のようになります。
i = prop[2][1][3];
このステートメントは、prop
の個々の要素への、より複雑な参照です。 この式は、次のように評価されます。
最初の添字
2
に、4 × 6 のint
配列のサイズが乗算され、それがポインター値prop
に加算されます。 結果は、prop
の 3 番目の 4 × 6 配列をポイントします。2 番目の添字
1
に 6 要素のint
配列のサイズが乗算され、それがprop[2]
で表されるアドレスに加算されます。6 つの要素を持つ配列の各要素は
int
値であるため、最後の添字の3
にint
のサイズが乗算され、それがprop[2][1]
に加算されます。 結果のポインターは 6 要素配列の 4 番目の要素のアドレスを指します。このポインター値に間接演算子が適用されます。 結果は、そのアドレスにある
int
要素です。
次の 2 つの例は、間接演算子が適用されないケースを示しています。
ip = prop[2][1];
ipp = prop[2];
この最初のステートメントの式 prop[2][1]
は、(以前に宣言した) 3 次元配列 prop
への有効な参照で、この場合は 1 つの 6 要素配列を参照しています。 ポインター値は配列のアドレスを指すため、間接演算子は適用されません。
同様に、2 番目のステートメント prop[2]
の式 ipp = prop[2];
の結果は、1 つの 2 次元配列のアドレスを指すポインター値です。