(1次元の)配列を宣言する一般的な形式は次の通り。
型 変数名[サイズ];
- 配列の要素はすべて同じ型
- 要素にアクセスするには変数名に大カッコ([])で囲んだ添字をつけてアクセスする
- 添字は 0 から始まる
- 配列は連続したメモリ領域に格納される
- 配列をまるごと代入(コピー)することは出来ない。要素を1つずつ代入(コピー)する
要素を1つずつコピーしなきゃいけないのな面倒だな。
次のプログラムは、1 から 10 までの平方値を、配列 sqrs に格納してから表示する。
#include int main(void) { int sqrs[10]; int i; for (i = 1; i < 11; i++) { sqrs[i - 1] = i * i; } for (i = 0; i < 10; i++) { printf("%d ", sqrs[i]); } printf("\n"); return 0; }
takatoh@nightschool $ ./sample_5_1 1 4 9 16 25 36 49 64 81 100
もうひとつ、大事なこと。
C では配列の添字の範囲をチェックしない。例えばサイズ 10(添字は 0〜9)の配列の11番目の要素(添字10)にもアクセスできてしまう。もちろん正しい動作にはならないので、場合によってはプログラムがクラッシュするかもしれない。
ちょっと試してみよう。
#include int main(void) { int ary[10]; int i; for (i = 1; i < 11; i++) { ary[i - 1] = i; } printf("%d\n", ary[10]); /* out of range */ return 0; }
takatoh@nightschool $ gcc sample_5_1a.c -o sample_5_1a takatoh@nightschool $ ./sample_5_1a 0
何事もないかのようにコンパイルされたけど、実行すると、代入したはずのない ary[10] の出力として、0 と表示された。
何度か試してみたけど、毎回 0 と表示される。これはたまたまかもしれないし、gcc がそうしているのかもしれない。どちらにせよ、配列の要素にアクセスするときには添字の範囲に注意が必要だ。