(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 がそうしているのかもしれない。どちらにせよ、配列の要素にアクセスするときには添字の範囲に注意が必要だ。