【基礎から学ぶプログラミング言語】 C言語/配列変数とは何なのか?使用する利点を含めてわかりやすく解説!

IT
スポンサーリンク
スポンサーリンク
スポンサーリンク

私たちは日常生活で何気なくパソコンやスマートフォンというコンピュータを使用しています。
これらのコンピュータが普通に動作しているのは、そのようにプログラミング言語が記述されているからです。
本記事は、そんなプログラミング言語について実際に学びながら要点をまとめていったメモという位置付けになります。
私は専攻が電気でプログラムに関しては全くの初心者ですので、同様に初心者の方には理解しやすくなっているかと思います。

今回は、「C言語/配列変数」についての説明です。

1.初めに

以前までの記事で、プログラムの主な処理要素である順次処理・分岐処理・繰り返し処理についてまとめてきました。
これらを理解していればプログラムの流れはそこそこわかるようになってくるのですが、実際にプログラムを記述しようとすると何かと物足りなくなってきます。
数学で公式は覚えたけど、いざ実践するとなるとその公式以外の知識や工夫が必要になるのと同じです。

ということで、今回からは追加でできることや応用していくための知識にフォーカスしていくことになるかと思います。
その足掛かりとして、配列について解説していきます。

2.配列変数について

int関数やdouble関数の使用方法については過去の記事で説明しました。
intは整数(小数や分数を含まない数)、doubleは実数(虚数以外の全ての数)を定義することができる関数ですね。

例えば、【int a;】とすれば整数aが定義され、【double b , c;】とすれば実数bと実数cが定義されます。

「,」で区切れば複数の変数をまとめて定義できるわけですが、複数の変数をまとめて定義する方法は他にも存在します。
それは、以下のような表現です。

int a[3];

[3]というものが付いていますね。
この[]の中の数字は添え字と呼びます。
このように表記すると、a[0]・a[1]・a[2]という別々の変数が定義されます。
頭文字は共通していますが、添え字が異なるなら違う変数なのです。
この1つ1つの変数の入れ物を要素と呼び、このような変数を配列変数と呼びます。
変数の入れ物が連番になって連なるから配列変数です。

プログラムが複雑になっていくと使用する変数も増えていくので、自動的に複数の変数が定義される配列という機能は便利なんです。

配列変数は、添え字の数だけ0から連番で作られていきます。
【int a[4];】ならa[0]・a[1]・a[2]・a[3]、【int a[5];】ならa[0]・a[1]・a[2]・a[3]・a[4]という具合に定義されるようになるわけです。

配列変数を使用する利点

[]を使用して複数の変数をまとめて定義する方法はわかりましたが、配列変数を使用しなくても複数の変数を定義することは可能です。
ですが、配列変数を使用する方法を用いなければ実現できないようなことが存在します。

以下のようなプログラムを書いてみます。

#include<stdio.h>

void main() {
double a[3];
double sum;
int x;
a[0] = 1.1;
a[1] = 2.2;
a[2] = 3.3;
sum = 0.0;
for (x = 0; x < 3; x++) {
printf(“%f\n”, a[x]);
sum += a[x];
}
printf(“\n”);
printf(“a[0] + a[1] + a[2] = %f”, sum);
}

図1

これまでまとめてきた内容をいくつも組み合わせたプログラムになっています。
一箇所を除けば理解できるはずですが、復習の意味を込めて順番に解説していきます。
基本的には過去に説明した内容ですので、もしよくわからなくなったら過去の詳しくまとめてある方の記事に目を通してみてください。

まず4~6行目ですが、ここではint関数とdouble関数で変数を定義しているだけです。
実数の変数であるa[0]・a[1]・a[2]・sum及び整数の変数であるxの計4種類の変数を定義しました。
続く7~10行目では、実数の変数であるa[0]・a[1]・a[2]・sumの初期化を行っています。

次に、11~14行目でfor文が登場します。
ここで変数xの初期化をしつつ、繰り返し処理を行います。
繰り返しの条件は「xが3よりも小さい」で、その際の処理の内容は「x = x + 1をする」です。
そして、繰り返しの度に【printf(“%f\n”, a[x]);】と【sum += a[x];】を実行します。
【%f】は実数の変換指定子だから良いのですが、その【%f】に入る変数が【a[x]】になっています
これが配列関数の利点・新要素です。

a[x]なんて変数は定義していないけどこれは何なのかと思うかもしれませんが、[]の中のxに関しては定義してありますよね?
変数xはforループによって0→1→2と変化していきます。
ということは、printfで出力される変数はa[0]・a[1]・a[2]になるんです。
これらの変数なら定義してありますよね?
だから、a[x]なんて変数は定義していなくとも成り立つのです。
このように、繰り返し処理と組み合わせると、変数の値を動的に変化させることができるのです。

12行目のprintfは繰り返し処理に組み込まれているので、a[0]・a[1]・a[2]を順番に表示します。

13行目はコメントに書いてありますが、【sum = sum + a[x]】を行います。
変数sumの初期値は0.0なので、繰り返し処理によって【0.0 + a[0]】→【a[0] + a[1]】→【a[0] + a[1] + a[2]】という具合に加算処理されていくことがわかります。
要するに、最終的には変数sumはa[0]+a[1]+a[2]という合計値になるんです
後は、16行目で変数sumを出力することで、a[0]+a[1]+a[2]の結果を表示しているのです。

プログラムを実行すると、以下のようになります。

図2

説明した通りの処理が行われているでしょう?

ちなみに、12行目をちょっと弄ってあげると、より分かりやすい結果を得られるようになります。

図3

3.配列変数を定義しつつ初期化する方法

ここまでの説明では、配列変数を必要数定義して、その後にそれぞれ初期化していきました。
ですが、配列変数を定義しつつ、同時に初期化も実行する方法が存在します。

変数を定義する際、以下のように記述します。

int a[] = {1,2,3};

[]の中には何も入力せず、{}内に1,2,3の数字が入力されていますね。
こうすると、【a[0] = 1】・【a[1] = 2】・【a[2] = 3】という具合に0から連番となるように配列変数が定義・初期化されます。

試しに、図1のプログラムをこの形式に置き換えてみると、以下のようになります。

図4

4行目で配列変数の定義と初期化を済ませたので、不要になった7~9行目はコメントアウトさせています。
実際に書き換えて、同様の結果が得られるか確認してみると良いかと思います。

ただ、注意点があります。
繰り返し処理で定義していない配列変数を含めないようにしましょう
この例で言うと、【x < 3】を【x < 4】のようにしてはいけないということです。
仮に【x < 4】にすると、以下のようになります。

図5

本来定義されていないa[3]の値がバグってますね。
このように、定義していない配列変数に関してはエラーが発生せずに謎の数値が表示されたりするので、重大なエラーに発展し兼ねません。
注意しましょう。

4.多次元配列について

ここまで説明した配列変数は、1次元配列と呼びます。
1次関数の“1次”と意味するところは同じです。
同一線上で並んでいるような配列だから1次元配列です。
単純に連番になるように変数が定義されていたでしょう?

ということは、平面の世界である2次元に対応した配列というものも存在します。
この配列のことは2次元配列と呼びます。

Excelにて、縦の列と横の行が存在しますよね?
これまでの1次元配列では縦のみに変数が配置されていましたが、2次元配列では横方向にも変数が配置されるようになったとイメージしてください

2次元配列は多次元配列の一部です。
“多次元”という名称通り、3次元配列・4次元配列というものも存在しますが、そこまで行くと結構複雑になってくるので、2次元配列くらいまでが使いやすいです。

では、2次元配列とはどんなものなのか見ていきましょう。

#include<stdio.h>

void main() {
int a[2][3];
int x, y;
for (x = 0; x < 2; x++) {
for (y = 0; y < 3; y++) {
a[x][y] = x + y;
printf(“%d + %d = %d “, x, y, a[x][y]);
}
printf(“\n”);
}
}

図6

新要素は4行目です。
これまでは【int a[2];】のように記載していましたが、【int a[2][3];】になっています。
[]の後ろにもう1つ[]が出てきていますね。
これが2次元配列です。
添え字を複数付けて管理するのです。

6~8行目ではfor文を用いて繰り返し処理をしています。
先にプログラムの実行結果を見てみますね。

図7

まず、6行目にて変数xの初期値は0になっていますので、x < 2という条件を満たしているので繰り返し処理が発生します。
すると、7行目に移行して、変数yの繰り返し処理が実行されます。
この時、8行目に書かれているように、【a[x][y] = x + y】が計算されるようになっています。

変数yのfor文は変数xのfor文に組み込まれているので、変数yの繰り返し処理が終わるまでは7~10行目をループします。
その為、x(0) + y(0~2)の結果が表示されます。
その部分が図7の1行目の【0 + 0 = 0 0 + 1 = 1 0 + 2 = 2 】です。
結果、a[0][0]が【0 + 0 = 0 】、a[0][1]が【0 + 1 = 1 】、a[0][2]が【0 + 2 = 2 】として表示されているわけです。

このyに関するループを抜けると11行目に則って改行処理が行われ、6行目に戻ります。
今度は変数xの値が1になり、x < 2の条件は未だ満たしたままなので、上記の処理が再び繰り返されます。
その結果、a[1][0]が【1 + 0 = 1 】、a[1][1]が【1 + 1 = 2 】、a[1][2]が【1 + 2 = 3 】と表示されるのです。

つまり、int a[2][3]という配列は、以下のように表現されているわけです。

a[0][0]a[0][1]a[0][2]
a[1][0]a[1][1]a[1][2]

2次元的な入れ物ができているでしょう?
これが多次元配列という考え方です。
座標表示しているようなものなので、様々な表やグラフに応用が可能です。

添え字が1つの1次元配列の場合は縦に入れ物が連なっていき、2次元配列になると横にも入れ物が増えていくと覚えましょう。
そうすれば、前後の添え字のどちらが縦でどちらが横に対応しているのか間違わずに済みます。

以上、C言語/配列変数についての説明でした。