C言語のきほん|1次元配列の基本操作

配列は、たくさんの値を整理して扱うための第一歩。1次元配列の基本操作を覚えると、C言語の表現力がぐっと広がります

C言語でプログラムを作っていると、同じ種類のデータをいくつもまとめて扱いたい場面がよくあります。
たとえば、5人分の点数、7日分の売上、10個の商品価格のように、同じ型の値を複数保存したいことがあります。

このようなとき、変数を1つずつ別々に用意していると、プログラムが長くなり、管理もしにくくなってしまいます。
そこで活躍するのが 1次元配列 です。

1次元配列を使うと、同じ型のデータをひとまとめにして扱えるようになります。
しかも、それぞれの要素には番号がついているので、必要な場所に値を入れたり、取り出したりできます。
この仕組みを理解すると、繰り返し処理と組み合わせてたくさんのデータを効率よく扱えるようになります。

ただし、配列は便利な反面、普通の変数とは少し違うルールがあります。
たとえば、添字は 0 から始まること、宣言しただけでは要素が不定値のままであること、使える範囲を超えてはいけないことなど、最初にしっかり押さえておきたい点があります。

ここでは、1次元配列の基本操作として、宣言、値の代入、要素の参照を順番に見ていきます。
配列のしくみをやさしく整理しながら、コードの読み方と書き方を丁寧に身につけていきましょう。

1次元配列とは

1次元配列は、同じ型のデータを一直線に並べて保存する仕組みです。
イメージとしては、番号つきの箱が並んでいて、それぞれの箱に値を入れるような形です。

たとえば、int 型の値を5個保存する配列なら、次のように考えると分かりやすいです。

この箱ひとつひとつが、配列の 要素 です。
そして、それぞれの位置を表す番号を 添字 と呼びます。

C言語では、この添字が 0 から始まるところが大切です。

1次元配列を宣言する

まずは、配列を使うために宣言が必要です。

文法

型名 配列名[要素数];

この形で書くと、指定した型の要素を、指定した個数だけ持つ配列を用意できます。

各部分の意味

項目内容
型名配列に入れるデータの型
配列名配列につける名前
要素数何個の要素を持つか

たとえば、整数を5個保存する配列なら、次のように書きます。

int scores[5];

これは、int 型の要素を5個持つ配列 scores を宣言するという意味です。

宣言しただけでは中身は決まっていない

ここで大事なのは、配列を宣言しただけでは、各要素の中身はまだ不定値だということです。
不定値とは、どんな値が入っているか決まっていない状態のことです。

つまり、次のような宣言をしただけでは、

int scores[5];

中身は次のようなイメージです。

配列 scores
[0] 不定値
[1] 不定値
[2] 不定値
[3] 不定値
[4] 不定値

この状態の要素をそのまま使うと、予測できない動作につながることがあります。
そのため、使う前に値を代入することが大切です。

要素数と添字は別物

配列学習で最初につまずきやすいのが、要素数添字 の違いです。

たとえば、

int scores[5];

と書いたとき、要素数は 5 です。
でも、使える添字は 0 から 4 までです。

項目
要素数5
最初の添字0
最後の添字4

つまり、要素数が5だからといって scores[5] が使えるわけではありません。
使えるのは scores[0] から scores[4] までです。

1次元配列に値を代入する

宣言した配列には、添字を使って各要素に値を代入します。

文法

配列名[添字] = 値;

各部分の意味

項目内容
配列名値を入れる配列の名前
添字どの要素に入れるかを示す番号
実際に代入する値

たとえば、次のように書きます。

scores[0] = 85;
scores[1] = 92;
scores[2] = 78;

この意味は、

  • scores[0] に 85 を入れる
  • scores[1] に 92 を入れる
  • scores[2] に 78 を入れる

ということです。

代入後の配列の状態

このとき、配列の中身は次のようになります。

配列 scores
[0] 85
[1] 92
[2] 78
[3] 不定値
[4] 不定値

ここで注意したいのは、値を代入した要素だけが確定し、代入していない要素は不定値のままだということです。

つまり、

scores[0] = 85;
scores[1] = 92;
scores[2] = 78;

と書いても、scores[3] と scores[4] にはまだ値を入れていません。
そのため、その2つはまだ使わないほうが安全です。

1次元配列の要素を参照する

配列の要素を使いたいときも、添字を使って指定します。

文法

配列名[添字]

この形は、配列の中の1つの要素を表します。
たとえば、scores[0] は scores の0番目の要素です。

この要素を printf の中で使えば、値を表示できます。

printf("%d\n", scores[0]);
printf("%d\n", scores[1]);
printf("%d\n", scores[2]);

このコードでは、scores[0]、scores[1]、scores[2] の値が順番に表示されます。

サンプルプログラムで確認しよう

元の例では学生の点数を使っていましたが、ここでは内容を変えて、5日分の水分補給量を扱うシンプルな例にしてみます。
コメントも表示メッセージも日本語にしています。

サンプルプログラム

ファイル名:10_2_1.c

#include <stdio.h>

int main(void)
{
    // 配列の宣言
    int drinks[5];    // 5日分の水分補給量を保存する配列

    // 配列に値を代入
    drinks[0] = 1200;    // 1日目の水分補給量
    drinks[1] = 1500;    // 2日目の水分補給量
    drinks[2] = 900;     // 3日目の水分補給量

    // 配列要素を参照して表示
    printf("%d\n", drinks[0]);
    printf("%d\n", drinks[1]);
    printf("%d\n", drinks[2]);

    return 0;
}

実行結果の例

1200
1500
900

このプログラムの流れを見てみよう

このプログラムでは、次の順番で配列を使っています。

配列の宣言

int drinks[5];

ここで、int 型の要素を5個持つ配列 drinks を用意しています。
ただし、この時点では中身はまだ不定値です。

要素への代入

drinks[0] = 1200;
drinks[1] = 1500;
drinks[2] = 900;

ここで、先頭から3つの要素に値を入れています。
一方で、drinks[3] と drinks[4] にはまだ値を入れていません。

要素の参照

printf("%d\n", drinks[0]);

この形で、配列の中の値を取り出して表示しています。
普通の変数のように扱っているように見えますが、実際には 配列名 + 添字 で要素を指定しています。

初期化との違いも知っておこう

今回の中心は宣言、代入、参照ですが、配列には初期化という方法もあります。
初期化は、宣言と同時に値を入れる書き方です。

int drinks2[] = {1200, 1500, 900, 1100, 1300};

このように書くと、配列を作ると同時に全要素へ値を入れられます。

宣言と代入と初期化の違いを表にすると、次のようになります。

操作意味
宣言int a[5];配列だけ用意する
代入a[0] = 10;あとから1要素ずつ値を入れる
初期化int a[] = {10, 20, 30};宣言と同時に値を入れる

配列の要素は普通の変数のように使える

配列の各要素は、取り出してみると1つの値です。
そのため、計算や表示にも使えます。

たとえば次のようなことができます。

int total = drinks[0] + drinks[1];
printf("%d\n", total);

このように、drinks[0] や drinks[1] は整数値として扱えます。
つまり、配列そのものは複数の値の集まりですが、配列の各要素は普通の変数のように使えるということです。

添字の範囲外を使ってはいけない

配列では、使える添字の範囲を守ることがとても重要です。

たとえば、

int drinks[5];
int drinks[5];

なら、使える添字は 0 ~ 4 です。
次のような指定は正しくありません。

drinks[5] = 1000;

これは6番目の要素を使おうとしていることになり、配列の範囲外です。
このような書き方は、バグや予期しない動作の原因になります。

配列の状態を表で整理しよう

今回のサンプルの代入後の状態を表にすると、こうなります。

添字
01200
11500
2900
3不定値
4不定値

この表を見ると、どの要素に値が入っていて、どれが未設定なのかが分かりやすいです。

変数と配列の違い

普通の変数と配列の違いも整理しておきましょう。

項目普通の変数配列
保存できる値の数1個複数個
使い方変数名で参照配列名と添字で参照
向いている場面単独の値を扱う同じ型の値をまとめて扱う

たとえば、1人分の点数なら普通の変数でも十分です。
でも、30人分の点数を扱うなら、配列のほうが圧倒的に便利です。

1次元配列の基本操作を図でイメージしよう

ここまでの内容を、流れとして図にすると次のようになります。

この3段階を押さえておくと、1次元配列の基本はかなり理解しやすくなります。

よくあるつまずき

1次元配列の学習では、次のような点でつまずきやすいです。

つまずきやすい点内容
添字を1から始めてしまうC言語では0から始まる
要素数と最後の添字を混同する要素数5なら最後は4
宣言しただけで使ってしまう中身は不定値のことがある
一部だけ代入して全部使う代入していない要素は不定値のまま
範囲外の添字を使うバグの原因になる

このあたりを意識しながらコードを読むと、配列の動きがかなりつかみやすくなります。

これから先につながる大事な土台

1次元配列の宣言、代入、参照は、配列学習の出発点です。
この基本がしっかり分かると、次に学ぶ繰り返し処理との組み合わせ、配列の初期化、2次元配列、文字列、関数への受け渡しなども理解しやすくなります。

配列は少し見た目が独特ですが、考え方はとても素直です。
同じ型のデータを、番号つきの箱にまとめて保存する
このイメージをしっかり持てるようになると、C言語らしいデータの扱い方がどんどん見えてきます。