後置式とその後に続く [ ] (大括弧) 内の式が、 配列のエレメントを指定します。 大括弧内の式は、添え字 と呼ばれます。 配列の最初のエレメントは、添え字 0 を取ります。
定義上、式 a[b] は、式 *((a) + (b)) と等価です。また、加算は結合であるので、b[a] にも等価です。式 a と b の間で、一方は、型 T に対するポインターでなければなりません。 そして他方は、整数型または列挙型を持っていなければなりません。 配列添え字の結果は、左辺値になります。次の例は、このことを示しています。
#include <stdio.h> int main(void) { int a[3] = { 10, 20, 30 }; printf("a[0] = %d¥n", a[0]); printf("a[1] = %d¥n", 1[a]); printf("a[2] = %d¥n", *(2 + a)); return 0; }
次に、上記の例の出力を示します。
a[0] = 10 a[1] = 20 a[2] = 30
C99 では、左辺値ではない配列での配列添え字が可能です。ただし、非左辺値のアドレスを配列添え字として使用することはできません。以下の例は
C99 では有効ですが、C89 では無効です。
struct trio{int a[3];}; struct trio f(); foo (int index) { return f().a[index]; }
添え字演算子が必要とする、式の型に関する上述の制限だけでなく、
添え字演算子とポインター演算の間の関係も、
クラスの operator[] を多重定義する場合、適用されません。
各配列の最初のエレメントに、添え字 0 が付けられます。式 contract[35] は、 配列 contract の 36 番目のエレメントを参照します。
多次元配列では、最も頻繁に右端添え字を増分することによって (保管場所の昇順で)、 各エレメントを参照できます。
例えば、次のステートメントは、配列 code[4][3][6] の 各エレメントに 100 を与えます。
for (first = 0; first < 4; ++first) { for (second = 0; second < 3; ++second) { for (third = 0; third < 6; ++third) { code[first][second][third] = 100; } } }
関連参照