6日でできる 新C言語入門|配列の宣言・初期化・参照

複数の値を、ひとつの名前でまとめて扱う。
配列の宣言・初期化・参照を理解して、C言語のデータ処理をもっと効率よく書けるようになろう。

C言語でプログラムを書いていると、同じ種類のデータをまとめて扱いたい場面がよくあります。たとえば、複数人の点数、1週間分の気温、商品の価格、センサーで取得した複数の測定値などです。

このようなデータを1つずつ別々の変数で管理すると、変数名がどんどん増えてしまいます。

たとえば、3人分の点数を扱うだけでも、次のように複数の変数が必要になります。

int score1;
int score2;
int score3;

これが10人分、100人分になると、個別の変数で管理するのは大変です。そこで便利なのが配列です。

配列を使うと、同じ型の複数の値を、ひとつの名前でまとめて管理できます。たとえば、3つの整数をまとめて扱いたい場合は、次のように書けます。

int score[3];

このように書くと、scoreという名前で、int型の値を3つ分まとめて扱えるようになります。

配列では、それぞれの要素に番号を付けてアクセスします。この番号を添え字、またはインデックスと呼びます。C言語の配列では、添え字は0から始まります。ここは配列を学ぶうえでとても重要なポイントです。

この記事では、配列の宣言、値の代入、初期化、参照、for文との組み合わせ、添え字の範囲外アクセスの注意点まで、サンプルプログラムを使いながらやさしく解説していきます。

配列は同じ型の値をまとめて管理する仕組み

配列は、同じ型のデータを複数まとめて扱うための仕組みです。

基本の宣言は次の形です。

型 配列名[要素数];

たとえば、int型の値を5個まとめて扱いたい場合は、次のように宣言します。

int data[5];

この場合、dataという配列には、int型の値を5個入れられます。

宣言例意味
int score[3];int型の値を3個入れられる配列
double price[5];double型の値を5個入れられる配列
char mark[4];char型の値を4個入れられる配列

配列では、配列名だけでなく、添え字を使って各要素を指定します。

score[0] = 70;
score[1] = 80;
score[2] = 90;

このように、score[0]、score[1]、score[2]のように書くことで、それぞれの要素に値を入れられます。

添え字は0から始まる

C言語の配列で最初にしっかり覚えたいのが、添え字は0から始まるということです。

たとえば、次のように宣言した場合を考えます。

int score[3];

この配列には3つの要素がありますが、使える添え字は0、1、2です。

要素の位置添え字書き方
1番目0score[0]
2番目1score[1]
3番目2score[2]

要素数が3だからといって、score[3]が使えるわけではありません。score[3]は4番目の要素を意味してしまうため、配列の範囲外になります。

配列を使うときは、要素数と有効な添え字の関係を常に意識しましょう。

図:配列の添え字は0から始まる

この図から分かること

この図から分かるのは、配列の要素は1番目、2番目、3番目と数えられる一方で、C言語の添え字は0、1、2と始まるという点です。

要素数が3の配列では、使える添え字は0から2までです。score[3]は使える範囲を超えてしまうため、配列を扱うときは、要素数より1小さい添え字までが有効だと覚えておくことが大切です。

配列に値を入れて表示する

まずは、配列を宣言し、それぞれの要素に値を代入して表示するプログラムを見てみましょう。

プロジェクト/ファイル名: Lesson31_1/main.c

#include <stdio.h>

int main(void) {
    int temperature[3];

    // 3日分の気温を配列に代入する
    temperature[0] = 22;
    temperature[1] = 25;
    temperature[2] = 24;

    // 配列の要素を1つずつ表示する
    printf("1日目の気温: %d度\n", temperature[0]);
    printf("2日目の気温: %d度\n", temperature[1]);
    printf("3日目の気温: %d度\n", temperature[2]);

    return 0;
}

実行結果

1日目の気温: 22度
2日目の気温: 25度
3日目の気温: 24度

このプログラムでは、temperatureという配列を宣言しています。

int temperature[3];

これは、int型の値を3つ入れられる配列を用意するという意味です。

その後、temperature[0]、temperature[1]、temperature[2]にそれぞれ値を代入しています。

temperature[0] = 22;
temperature[1] = 25;
temperature[2] = 24;

最後に、printfを使って各要素の値を表示しています。

配列の宣言・代入・参照を整理する

配列を扱うときは、宣言、代入、参照の3つの操作を意識すると分かりやすくなります。

操作書き方説明
宣言int temperature[3];int型の値を3つ入れられる配列を作る
代入temperature[0] = 22;0番目の要素に22を入れる
参照temperature[1]1番目の要素の値を取り出す
表示printfでtemperature[2]を表示する2番目の要素を画面に表示する

配列の要素は、通常の変数と同じように代入したり参照したりできます。ただし、どの要素を扱うのかを添え字で指定する必要があります。

配列はfor文と組み合わせると便利

配列は、for文ととても相性がよいです。

配列の添え字は0から順番に増えていくため、for文のカウンタ変数をそのまま添え字として使えます。

たとえば、3つの要素を順番に表示したい場合は、次のように書けます。

int i;

for (i = 0; i < 3; i++) {
    printf("%d\n", temperature[i]);
}

ここで、iは0、1、2と変化します。これは、temperature[0]、temperature[1]、temperature[2]に対応します。

つまり、for文を使うことで、配列の要素をまとめて処理できます。

配列の初期化

配列は、宣言と同時に値を入れることもできます。これを初期化と呼びます。

int score[3] = {70, 80, 90};

このように書くと、次のように代入したのと同じような意味になります。

score[0] = 70;
score[1] = 80;
score[2] = 90;

また、初期化のときに要素数を省略することもできます。

double price[] = {120.5, 80.0, 65.5};

この場合、初期化している値が3つあるため、配列の要素数は自動的に3になります。

書き方意味
int a[3] = {10, 20, 30};3つの要素を持つ配列を初期化する
int a[] = {10, 20, 30};要素数を値の個数から自動で決める
double price[] = {120.5, 80.0, 65.5};double型の配列を3つの値で初期化する

配列に最初から値を入れておきたい場合は、初期化を使うとコードが短く分かりやすくなります。

配列とfor文で合計と平均を計算する

次は、配列とfor文を組み合わせて、複数の値の合計と平均を計算するプログラムを見てみましょう。

プロジェクト/ファイル名: Lesson31_2/main.c

#include <stdio.h>

int main(void) {
    double height[4] = {160.5, 172.0, 168.5, 175.0};
    double sum = 0.0;
    int i;

    // 配列の要素を順番に加算する
    for (i = 0; i < 4; i++) {
        sum += height[i];
    }

    // 合計と平均を表示する
    printf("身長の合計: %.1f cm\n", sum);
    printf("身長の平均: %.1f cm\n", sum / 4);

    return 0;
}

実行結果

身長の合計: 676.0 cm
身長の平均: 169.0 cm

このプログラムでは、height配列に4人分の身長を入れています。

double height[4] = {160.5, 172.0, 168.5, 175.0};

for文では、iを0から3まで変化させながら、height[i]をsumに加えています。

for (i = 0; i < 4; i++) {
    sum += height[i];
}

iが0のときはheight[0]、iが1のときはheight[1]というように、順番に要素を取り出して合計しています。

図:for文で配列の要素を順番に処理する

この図から分かること

この図から分かるのは、for文のカウンタ変数を配列の添え字として使えるという点です。

iが0ならheight[0]、iが1ならheight[1]、iが2ならheight[2]、iが3ならheight[3]を処理します。このように、配列とfor文を組み合わせると、複数のデータを順番にまとめて扱えるため、合計や平均の計算が書きやすくなります。

配列の要素数とfor文の条件

配列をfor文で処理するときは、繰り返し条件がとても重要です。

要素数が4の場合、有効な添え字は0、1、2、3です。そのため、for文では次のように書きます。

for (i = 0; i < 4; i++)

i < 4と書くことで、iは0、1、2、3まで変化します。iが4になると条件が偽になり、ループを終了します。

もしi <= 4と書いてしまうと、iが4のときにも処理が実行されます。するとheight[4]を参照することになり、範囲外アクセスになります。

配列宣言要素数有効な添え字for文の条件例
int a[3];30, 1, 2i < 3
double x[4];40, 1, 2, 3i < 4
int data[5];50, 1, 2, 3, 4i < 5

配列の処理では、要素数とfor文の条件が正しく対応しているかを必ず確認しましょう。

配列をまとめて初期化して表示する

配列は、宣言時にまとめて初期化しておくと便利です。次のプログラムでは、4日分の歩数を配列に入れて、for文で順番に表示します。

プロジェクト/ファイル名: Lesson31_3/main.c

#include <stdio.h>

int main(void) {
    int steps[4] = {4200, 5800, 7600, 6100};
    int i;

    // 4日分の歩数を順番に表示する
    for (i = 0; i < 4; i++) {
        printf("%d日目の歩数: %d歩\n", i + 1, steps[i]);
    }

    return 0;
}

実行結果

1日目の歩数: 4200歩
2日目の歩数: 5800歩
3日目の歩数: 7600歩
4日目の歩数: 6100歩

このプログラムでは、steps配列を宣言すると同時に、4つの値を入れています。

int steps[4] = {4200, 5800, 7600, 6100};

for文では、iが0から3まで変化します。表示では、日数として分かりやすくするために、i + 1を使っています。

printf("%d日目の歩数: %d歩\n", i + 1, steps[i]);

配列の添え字は0から始まりますが、画面に表示する日数や人数は1から始めたいことがよくあります。そのような場合は、表示用にi + 1を使うと自然です。

配列の初期化で要素数を省略する

配列の初期化では、要素数を省略できる場合があります。

int steps[] = {4200, 5800, 7600, 6100};

この場合、値が4つあるため、stepsは4つの要素を持つ配列になります。

ただし、要素数を省略できるのは、宣言と同時に初期化する場合です。あとから代入するだけでは、要素数を自動で判断することはできません。

書き方説明
int steps[4] = {4200, 5800, 7600, 6100};要素数を明示して初期化
int steps[] = {4200, 5800, 7600, 6100};値の個数から要素数を自動決定
int steps[4];要素数だけ指定して、あとから値を入れる

学習段階では、要素数を明示しておくと分かりやすいです。慣れてきたら、初期化の値から要素数を自動で決める書き方も使えるようになります。

添え字の範囲外アクセスに注意する

C言語の配列で特に注意したいのが、添え字の範囲外アクセスです。

たとえば、次のように宣言した場合を考えます。

int number[2] = {10, 20};

この配列で使える添え字は0と1だけです。

書き方状態
number[0]有効
number[1]有効
number[2]範囲外

number[2]は、3番目の要素を意味します。しかし、number配列には2つの要素しかありません。そのため、number[2]に値を代入したり、number[2]を表示したりすると、範囲外アクセスになります。

C言語では、配列の範囲外アクセスを自動で安全に止めてくれるとは限りません。実行時に異常終了したり、別のデータを壊したり、予期しない結果になったりする可能性があります。

添え字を間違えた場合の注意例

次のプログラムは、添え字を間違えた場合の危険性を理解するための注意例です。実際のプログラムでは、このような範囲外アクセスは避けてください。

プロジェクト/ファイル名: Lesson31_4/main.c

#include <stdio.h>

int main(void) {
    int number[2] = {10, 20};

    // 注意: number[2]は有効な範囲外の添え字
    number[2] = 30;

    // 注意: 範囲外の要素を参照している
    printf("%d\n", number[2]);

    return 0;
}

このプログラムでは、number[2]に値を代入しようとしています。しかし、number配列の有効な添え字は0と1だけです。

そのため、number[2]は範囲外アクセスです。開発環境によっては、バッファーオーバーランに関する警告やエラーが表示されることがあります。また、警告が出ない環境でも、安全なコードではありません。

配列宣言有効な添え字範囲外の例
int number[2];0, 1number[2]
int data[3];0, 1, 2data[3]
double value[4];0, 1, 2, 3value[4]

添え字の最大値は、要素数ではなく要素数 - 1です。この考え方をしっかり覚えておきましょう。

図:範囲外アクセスは危険

この図から分かること

この図から分かるのは、要素数2の配列ではnumber[0]とnumber[1]だけが有効であり、number[2]は範囲外になるという点です。

C言語では、範囲外の添え字を使うと、意図しないメモリ領域にアクセスしてしまう可能性があります。配列を安全に使うためには、添え字が0から要素数 - 1までに収まっているかを常に確認することが大切です。

配列を使うメリット

配列を使うと、同じ種類のデータをまとめて扱えるようになります。これにより、プログラムがすっきりし、for文との組み合わせで処理をまとめやすくなります。

メリット説明
同じ型のデータをまとめられる点数、価格、気温などを1つの配列名で管理できる
for文でまとめて処理できる合計、平均、表示などを繰り返しで書ける
変数名が増えすぎないscore1、score2のような個別変数を減らせる
データの並びを扱いやすい0番目、1番目のように順番で処理できる

配列は、C言語で複数データを扱うための基本です。今後、文字列、2次元配列、関数への配列渡しなどを学ぶときにも、配列の考え方が土台になります。

配列を書くときの注意点

配列を安全に使うためには、いくつかのポイントを意識しましょう。

添え字は0から始める

最初の要素は配列名[0]です。1番目だから配列名[1]ではありません。

最後の添え字は要素数 - 1

要素数が5なら、有効な添え字は0、1、2、3、4です。

for文の条件に注意する

要素数が5なら、i < 5のように書くと、iは0から4までになります。i <= 5と書くと範囲外アクセスになる可能性があります。

配列の型をそろえる

int型の配列には整数、double型の配列には小数を入れるように、扱うデータに合った型を選びましょう。

初期化していない値を使わない

配列を宣言しただけでは、要素に期待した値が入っているとは限りません。使う前に代入または初期化しておくと安全です。

配列の宣言・初期化・参照を理解するとデータ処理が楽になる

配列を使えるようになると、複数のデータを1つのまとまりとして扱えるようになります。個別の変数をたくさん用意しなくても、配列名と添え字を使って順番に値を管理できます。

配列の基本は、宣言、初期化、参照です。宣言では、どの型の値を何個扱うかを決めます。初期化では、配列に最初から値を入れます。参照では、添え字を使って必要な要素を取り出します。

また、配列はfor文と組み合わせることで、すべての要素を順番に処理できます。合計や平均の計算、一覧表示など、複数データを扱う処理ではとても便利です。

一方で、C言語の配列では添え字の範囲に注意が必要です。添え字は0から始まり、最後は要素数 - 1です。範囲外アクセスをしないように気をつけながら、少しずつ配列の扱いに慣れていきましょう。