配列

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください