C++入門|配列で複数の値を扱う

配列は、複数の戦闘力や気の倍率をまとめて管理できる修行カプセル。添え字を使って一つひとつの値を取り出せば、C言語で大量のデータを扱う第一歩が見えてきます。

C言語で変数を学ぶと、数値を1つ入れておける箱のようなものとして理解できました。

たとえば、戦闘力を1つだけ扱うなら、int power; のような変数を用意すれば十分です。
しかし、戦士が3人いて、それぞれの戦闘力を管理したい場合はどうでしょうか。

power1、power2、power3のように変数をたくさん作ることもできます。
でも、人数が10人、100人と増えていくと、変数名をひとつずつ用意するのは大変です。

そこで登場するのが 配列 です。

配列は、同じ種類の値をまとめて並べておける変数です。
ドラゴンボール風にたとえるなら、配列は修行場に並んだエネルギーカプセルの列です。

1つのカプセルには1つの値が入り、カプセルには0番、1番、2番のような番号が付いています。
この番号を使って、必要な値を取り出したり、別の値を入れたりできます。

学ぶ内容意味ドラゴンボール風のイメージ
配列複数の値をまとめて扱う変数並んだ修行カプセル
要素配列の中の1つ1つの値1つのカプセル
添え字要素の番号カプセル番号
配列の大きさ配列に入れられる要素数カプセルの個数
for文との組み合わせ配列を順番に扱うカプセルを順番に確認する

配列を使えるようになると、複数のデータを整理して扱えるようになります。

戦闘力、修行回数、気の倍率、スコア、点数、温度、売上など、同じ種類のデータをまとめたい場面で配列はとても役立ちます。

配列変数とは何か

配列変数とは、同じデータ型の値を複数まとめて入れられる変数です。

普通の変数は、基本的に1つの値を入れる箱です。

int power;

この場合、powerには整数を1つだけ入れられます。

一方、配列を使うと、1つの名前で複数の値を管理できます。

int power[3];

この場合、powerという名前の配列に、整数を3つ入れられます。

ドラゴンボール風にたとえるなら、普通の変数は1つのエネルギーカプセルです。
配列は、同じ種類のエネルギーカプセルが横に3つ並んだ棚のようなものです。

書き方扱える値イメージ
int power;整数1個カプセル1個
int power[3];整数3個カプセル3個の棚

配列を使うと、複数の値を1つの名前でまとめられるため、プログラムが整理しやすくなります。

たとえば、3人の戦士の戦闘力を扱う場合、power[0]、power[1]、power[2]のように番号を付けて管理できます。

図:配列は複数の値を入れる修行カプセル

この図が示していること

この図では、配列が複数の値をまとめて入れるための仕組みであることを表しています。

powerという配列には、power[0]、power[1]、power[2]という3つの要素があります。
それぞれの要素に、1200、1800、2400という別々の値を入れられます。

普通の変数が1つのカプセルだとすれば、配列は複数のカプセルをまとめた棚です。
同じ種類のデータをまとめて管理したいときに、配列が役立ちます。

配列を使ったプログラム

まずは、配列を使ったサンプルプログラムを見てみましょう。

ここでは、3つの戦闘力と、3つの気の倍率を配列に入れて表示します。

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

#include <stdio.h>

int main(int argc, char** argv) {
    // 戦闘力を入れる配列変数powerを宣言する
    int power[3];

    // 気の倍率を入れる配列変数rateを宣言と同時に初期化する
    double rate[] = { 1.1, 1.3, 1.5 };

    // 添え字として使う変数を宣言する
    int i;

    // 配列変数powerの各要素に値を代入する
    power[0] = 1200;
    power[1] = 1800;
    power[2] = 2400;

    // 配列の値を順番に表示する
    for (i = 0; i < 3; i++) {
        printf("power[%d]=%d ", i, power[i]);
        printf("rate[%d]=%lf\n", i, rate[i]);
    }

    // プログラムが正常に終わったことを示す
    return 0;
}

このプログラムを実行すると、次のように表示されます。

power[0]=1200 rate[0]=1.100000
power[1]=1800 rate[1]=1.300000
power[2]=2400 rate[2]=1.500000

このプログラムでは、整数を入れる配列powerと、小数を入れる配列rateを使っています。

powerには3つの整数を代入し、rateには宣言と同時に3つの小数を入れています。
そしてfor文を使って、0番目、1番目、2番目の値を順番に表示しています。

配列名データ型入っている値役割
powerint1200、1800、2400戦闘力を管理する
ratedouble1.1、1.3、1.5気の倍率を管理する

配列は、for文と組み合わせることで特に便利になります。

同じようなデータを順番に処理したいとき、配列とfor文はとても相性がよい組み合わせです。

配列の宣言

配列を使うには、まず配列変数を宣言します。

今回のプログラムでは、次のように書いています。

int power[3];

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

部分意味
int整数を扱うデータ型
power配列の名前
[3]要素数が3であること
;宣言の終わり

ここで [3] と書いているため、powerには3つの要素が用意されます。

ただし、配列の番号は1からではなく、0から始まります。
そのため、要素数が3の場合、使える添え字は0、1、2です。

要素数使える添え字
30、1、2
50、1、2、3、4
100から9

ここは、配列でとても大切なポイントです。

3個あるからといって、power[1]、power[2]、power[3]ではありません。
C言語の配列は0番から始まるため、power[0]、power[1]、power[2]になります。

ドラゴンボール風にたとえるなら、修行カプセルの番号札が0番から始まっているイメージです。
3つのカプセルがある場合、番号は0番、1番、2番です。

添え字は配列の部屋番号

配列の中の1つ1つの値を指定するために使う番号を、添え字といいます。

今回の配列powerでは、次のような要素が使えます。

power[0]
power[1]
power[2]

powerが配列の名前で、[0]、[1]、[2]が添え字です。

通常の変数が1つの箱だとすれば、配列は部屋がたくさん並んだ集合住宅のようなものです。

ドラゴンボール風にたとえるなら、powerは修行カプセル棟の名前、添え字はカプセル番号です。

書き方意味イメージ
power[0]power配列の0番目0番カプセル
power[1]power配列の1番目1番カプセル
power[2]power配列の2番目2番カプセル

配列名だけでは、どの要素を使うのか指定できません。
配列の中の値を使うには、配列名と添え字をセットで指定します。

配列の各要素に値を代入する

配列を宣言しただけでは、各要素に使いたい値が入っているわけではありません。

そこで、次のように代入します。

power[0] = 1200;
power[1] = 1800;
power[2] = 2400;

これは、power配列の0番目に1200、1番目に1800、2番目に2400を入れるという意味です。

代入意味
power[0] = 1200;0番目の要素に1200を入れる
power[1] = 1800;1番目の要素に1800を入れる
power[2] = 2400;2番目の要素に2400を入れる

ドラゴンボール風にたとえるなら、0番カプセルに戦闘力1200、1番カプセルに戦闘力1800、2番カプセルに戦闘力2400を入れている状態です。

配列の各要素は、普通の変数のように使えます。

つまり、power[0]に値を入れたり、power[1]を表示したり、power[2]を計算に使ったりできます。

図:添え字を使って配列の要素に値を入れる

この図が示していること

この図では、配列の各要素に値を代入する仕組みを表しています。

powerという配列には、power[0]、power[1]、power[2]という3つの要素があります。
それぞれの添え字を指定することで、どの場所に値を入れるのかを決められます。

配列では、添え字が部屋番号のような役割を持ちます。
どのカプセルにどの値を入れるのかを、添え字で正確に指定することが大切です。

配列の宣言と初期化を同時に行う

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

今回のプログラムでは、次のように書いています。

double rate[] = { 1.1, 1.3, 1.5 };

これは、double型の配列rateを用意し、最初から1.1、1.3、1.5を入れるという意味です。

doubleは、小数を扱うためのデータ型です。
今回のrateには、気の倍率のような小数の値を入れています。

書き方意味
double小数を扱うデータ型
rate[]配列rateを用意する
{ 1.1, 1.3, 1.5 }先頭から順番に値を入れる

この書き方では、[]の中に要素数を書いていません。

しかし、右側に3つの値が並んでいるため、C言語は要素数が3であると判断できます。

つまり、次のように書いた場合と似た意味になります。

double rate[3];

rate[0] = 1.1;
rate[1] = 1.3;
rate[2] = 1.5;

配列に最初から入れる値が決まっている場合は、宣言と初期化を同時に行うとすっきり書けます。

ドラゴンボール風にたとえるなら、修行カプセル棚を作ると同時に、各カプセルへ気の倍率を入れておくイメージです。

int配列とdouble配列の違い

今回のプログラムでは、int型の配列powerと、double型の配列rateを使っています。

この2つの違いは、入れられる値の種類です。

配列データ型扱う値
powerint整数1200、1800、2400
ratedouble小数1.1、1.3、1.5

int型は整数を扱います。
double型は小数を含む値を扱います。

戦闘力のように整数で表しやすい値はint型に向いています。
倍率や割合のように小数を含みやすい値はdouble型に向いています。

ドラゴンボール風にたとえるなら、int型の配列は整数の戦闘力を記録するカプセル棚、double型の配列は細かい気の倍率を記録する精密カプセル棚です。

for文で配列の中身を順番に表示する

配列の値を表示するときは、for文を使うと便利です。

今回のプログラムでは、次のように書いています。

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

ここで変数iは、配列の添え字として使われています。

iは0から始まり、1、2と増えていきます。
i < 3 の条件により、iが0、1、2の間だけ繰り返されます。

そのため、power[i]は次のように変化します。

iの値power[i]rate[i]
0power[0]rate[0]
1power[1]rate[1]
2power[2]rate[2]

このように、配列はfor文と組み合わせることで、同じ処理を要素ごとに繰り返せます。

ドラゴンボール風にたとえるなら、修行カプセルを0番から順番に調べて、戦闘力と気の倍率を表示パネルに出しているイメージです。

printfで配列の値を表示する

今回のプログラムでは、printfを使って配列の値を表示しています。

printf("power[%d]=%d ", i, power[i]);
printf("rate[%d]=%lf\n", i, rate[i]);

1つ目のprintfでは、power配列の添え字と値を表示しています。

printf("power[%d]=%d ", i, power[i]);

この行では、最初の%dにiの値が入り、次の%dにpower[i]の値が入ります。

たとえば、iが0のときは、次のように表示されます。

power[0]=1200

2つ目のprintfでは、rate配列の添え字と値を表示しています。

printf("rate[%d]=%lf\n", i, rate[i]);

ここでは、%lfを使ってdouble型の小数を表示しています。

書式指定表示する値
%dint型の整数
%lfdouble型の小数

配列を使うときは、添え字と値を一緒に表示すると、どの場所にどの値が入っているのか確認しやすくなります。

配列の範囲に注意する

配列を使うときに、とても大切な注意点があります。

それは、配列の範囲を超えてアクセスしてはいけないということです。

今回のpower配列は、次のように宣言されています。

int power[3];

この配列で使える添え字は、0、1、2です。

配列使える添え字範囲外
power[3]0、1、23、4、-1など
rate[3]0、1、23、4、-1など

power[3]と書くと、3番目だから使えそうに見えるかもしれません。
しかし、要素数3の配列で使える最後の添え字は2です。

C言語では、配列の範囲外にアクセスしてしまうと、予期しない動作につながることがあります。
エラーとして分かりやすく止まってくれるとは限らないため、とても注意が必要です。

ドラゴンボール風にたとえるなら、存在しない3番カプセルを開けようとしているようなものです。
修行場の管理装置が混乱し、思わぬトラブルにつながる可能性があります。

図:for文で添え字を0から2まで順番に動かす

この図が示していること

この図では、for文を使って配列の添え字を0から2まで順番に動かす流れを表しています。

iが0のときはpower[0]、iが1のときはpower[1]、iが2のときはpower[2]にアクセスします。
i < 3 という条件にしているため、iが3になる前にfor文が終了します。

配列の要素数が3の場合、使える添え字は0、1、2です。
i = 3 は範囲外になるため、for文の条件を正しく書くことが大切です。

i < 3 と書く理由

配列をfor文で扱うとき、次のように書いています。

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

ここで条件が i <= 3 ではなく、i < 3 になっている点が大切です。

要素数が3の配列で使える添え字は0、1、2です。
そのため、iが3になったら配列の範囲外です。

iの値アクセス先正しいか
0power[0]正しい
1power[1]正しい
2power[2]正しい
3power[3]範囲外

i < 3 と書けば、iが0、1、2の間だけ処理が実行されます。
iが3になると条件が成り立たなくなるため、ループが終了します。

配列とfor文を組み合わせるときは、添え字が配列の範囲内に収まるように条件を書くことがとても大切です。

配列は同じ種類のデータをまとめるのに向いている

配列は、同じ種類のデータをまとめて扱うときに便利です。

今回のサンプルでは、戦闘力をpower配列にまとめ、気の倍率をrate配列にまとめました。

データの例配列に向いている理由
3人分の戦闘力同じ種類の整数をまとめて管理できる
1週間分の気温日ごとの数値を順番に扱える
試験の点数複数人の点数をまとめて計算できる
修行回数ごとの記録回数ごとのデータを添え字で管理できる

配列を使うと、データが増えてもプログラムを整理しやすくなります。

たとえば、戦士が3人なら要素数3、5人なら要素数5、10人なら要素数10の配列を使うことで、同じ名前のまとまりとして扱えます。

ドラゴンボール風にたとえるなら、戦士ごとの戦闘力をバラバラの紙に書くのではなく、スカウターの一覧表としてまとめて記録しておくようなものです。

配列とfor文は相性がよい

配列を学ぶと、for文がさらに便利に感じられるようになります。

配列には、0、1、2、3のように添え字があります。
for文も、iを0から順番に増やしていく処理が得意です。

そのため、配列のすべての要素を順番に扱うとき、for文がよく使われます。

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

このように書くと、power[0]、power[1]、power[2]を順番に表示できます。

for文のi配列の要素
0power[0]
1power[1]
2power[2]

配列とfor文の組み合わせは、C言語の基本の中でもとても重要です。

ドラゴンボール風に言えば、for文は修行カプセルを順番に見回る巡回ロボットのようなものです。
0番から始まり、1番、2番と順番に確認していきます。

配列を使うとプログラムが整理しやすくなる

配列を使わない場合、複数の値を扱うために、次のように別々の変数を用意することになります。

int power0;
int power1;
int power2;

このような書き方でも、少ない数なら扱えます。
しかし、値が増えるほど管理が大変になります。

配列を使えば、次のように1つの名前でまとめられます。

int power[3];

このように書くと、powerというまとまりの中で、0番、1番、2番の値を管理できます。

書き方特徴
別々の変数を使う数が少ないときは分かりやすいが、増えると大変
配列を使う同じ種類のデータをまとめて扱いやすい

配列は、大量のデータを扱うための第一歩です。

今後、C言語やC++でより多くのデータを扱うとき、配列の考え方は必ず役に立ちます。

配列で覚えておきたいポイント

配列を使うときは、次のポイントを意識しましょう。

ポイント内容
配列は複数の値をまとめて扱う同じ種類のデータを並べて管理できる
添え字は0から始まる要素数3なら0、1、2を使う
配列名と添え字で要素を指定するpower[0]のように書く
宣言と初期化を同時にできるdouble rate[] = { 1.1, 1.3, 1.5 };
for文と相性がよい添え字を順番に変えながら処理できる
範囲外アクセスに注意するpower[3]やpower[-1]は避ける

配列は、最初は少し難しく感じるかもしれません。

特に、添え字が0から始まる点は、慣れるまで注意が必要です。
しかし、配列の考え方が分かると、複数の値を扱うプログラムがかなり書きやすくなります。

C言語では、配列を使えるようになることで、データをまとめて管理する力が身につきます。

ドラゴンボール風に言えば、1つの戦闘力だけを見る段階から、複数の戦士の戦闘力を一覧で管理できる段階へ進むイメージです。

配列を理解すると、for文との組み合わせで、同じ処理をたくさんのデータに対して効率よく実行できるようになります。
ここが、C言語のプログラムを一段階レベルアップさせる大事なポイントです。