配列

配列 (array) は同じ型の変数を複数個並べるための派生型です。
構文 type name[num];
type name[n1][n2]; // 2 次元配列の宣言
type name[n1][n2][n3]; // 3 次元配列の宣言

宣言と初期化

配列は演算子「[ ]」を使って宣言します。
char a[10]; // char 要素 10 個の配列 (10 バイト)
short b[10]; // short 要素 10 個の配列 (20 バイト)
char c[3][4]; // char[4] が 3 つ (12 バイト)
char* d1[4] // char を指すポインタが 4 つ
char (*d2)[4]; // char[4] を指すポインタが 1 つ
far char [100]; // far メモリに置かれる
char e1[2][3] = {{1,2,3},{4,5,6}}; // 2 次元配列の初期化
char e2[2][3] = {1,2,3,4,5,6}; // 上と同じ

配列は、文字列リテラルまたは値リスト ({ } で囲んだ初期化子の並び) で初期化できます。char (または wchar_t) と互換性のある型を要素とする配列は、文字列で初期化できます。
char a[4] = "123"; // 文字列で初期化
char b[4] = { 1, 2, 3, 0 }; // 上と同じ
int c[10] = "123"; // 要素が int 型なのでエラー
wchar_t d[3] = L"あか"; // ワイド文字列で初期化

指定した配列の要素数より初期化子が少ない場合は、残りの領域に 0 が補充されます。
char f[5] = "12"; // 0x31,0x32,0,0,0

文字列リテラルで初期化した場合は、余裕があれば末尾に 0 が付加されます。
char a[] = "123"; // a ← 0x31,0x32,0x33,0 (4 バイト)
char a[5] = "123"; // a ← 0x31,0x32,0x33,0,0 (5 バイト)
char a[4] = "123"; // a ← 0x31,0x32,0x33,0 (4 バイト)
char a[3] = "123"; // a ← 0x31,0x32,0x33 (3 バイト)
char a[2] = "123"; // エラー

初期化子がある場合は、配列の要素数を省略できます。
char f[] = "123"; // 初期化子があるため要素数は省略可
int s1 = sizeof( f ); // s1 = 4
char g[]; // 初期化子がないためエラー
char h[][3] = { "1", "23"}; // 有効 (2 × 3 = 6 バイト)
char i[2][] = { "1", "23"}; // エラー (最初の次元のみ省略可能)

自動変数の配列に初期化子を指定すると、その配列は静的変数と見なされます。
func() {
  char a[] = "123"; // 「static char a[] = "123";」と同じ
}

配列の参照

配列の要素は「<配列名>[<要素番号>]」の形式で参照します。先頭要素の番号は 1 ではなく 0 です。また、<配列名> を配列の先頭アドレスを表すポインタとして使用することもできます。
int a[10];
int x = a[2]; // x ← 配列の 2 番目の要素
int* p = a; // p ← 配列の先頭アドレス

関数の引数での配列

関数の仮引数を配列型で宣言した場合、その名前はポインタと同じように扱われます。
void func( int* a ) { ... }
void func( int a[] ) { ... } // 上と同じ
void func( int a[10] ) { ... } // 上と同じ。要素数は無視される

関数の実引数に配列名を渡すと、関数には配列のアドレスがポインタとして渡ってきます。
char a[10];
char* p = a;
func( a ); // func に a のアドレスを渡す
func( p ); // 上と同じ結果になる

Light C では、1 つの配列の大きさは 64 KB 以下に制限されています。