~初心者のプログラミング言語学習記~ サトルのC言語学習再挑戦!

「C言語」の「配列」を学んでみた

「C言語」の「配列」について学んでいきたいのですが、前回学んだ時に結構悩んだ記憶があるので、一つずつ丁寧に学んでいきたいと思います。

といっても、「Javascript」等も学んだので、今回は無事に「配列」を習得することができるかもしれないという期待もあります。

いろんな思いが込み上げてきて複雑な気分ですが、とにもかくにも学習を進めていきたい!

「配列」の作り方と利用方法

「配列」は「同じ種類の複数のデータ」を扱うことができる仕組みです。

「配列」を作るためには、

データ型 配列変数名[要素の個数];

と書くことで、「配列」を作ることができます。

例えば、

int numbers[5];

と書くと、「int型」のデータを入れることができる領域が5個用意されます。

配列

このように、配列変数の「大きな入れ物」があって、その中に「配列の要素」の「小さなデータの入れ物」があるイメージです。

それぞれの配列の要素は「0」から順番に番号が割り当てられるようになっていて、この番号を指定して、どの要素に値を入れるのかを指定していきます。

numbers[0] = 1;

と指定すると、「0」番の一番左の配列の要素に「1」の数値を入れることができます。

この仕組みを利用してプログラムを作成すると、

#include <stdio.h>

int main(void)
{
	int numbers[5];

	numbers[0] = 1;
	numbers[1] = 2;
	numbers[2] = 3;
	numbers[3] = 4;
	numbers[4] = 5;

	printf("numbers[0]の値は「%d」です。\n",numbers[0]);
	printf("numbers[1]の値は「%d」です。\n",numbers[1]);
	printf("numbers[2]の値は「%d」です。\n",numbers[2]);
	printf("numbers[3]の値は「%d」です。\n",numbers[3]);
	printf("numbers[4]の値は「%d」です。\n",numbers[4]);
	
	return 0;
}

のようになります。

これを実行すると、

numbers[0]の値は「1」です。
numbers[1]の値は「2」です。
numbers[2]の値は「3」です。
numbers[3]の値は「4」です。
numbers[4]の値は「5」です。

のように出力されます。

「配列」の仕組みも、プログラムを勉強している人は馴染みのある考え方ではないかなと思います。

他のプログラムでも、同じような機能がありますね。

「2次元配列」の仕組みと作り方

ここからは自分には少し難しく感じたのですが、「配列の中に配列を入れることができる」仕組みが、「2次元配列」です。

「配列」の1つ1つの要素の中に、「配列」が入っているという複雑な構造を持っています。

2次元配列

のようなイメージですが、プログラムで書くと、

#include <stdio.h>

int main(void)
{
	int numbers[5][5];

	numbers[0][0] = 1;
	numbers[0][1] = 2;
	numbers[0][2] = 3;
	numbers[0][3] = 4;
	numbers[0][4] = 5;

	printf("numbers[0][0]の値は「%d」です。\n",numbers[0][0]);
	printf("numbers[0][1]の値は「%d」です。\n",numbers[0][1]);
	printf("numbers[0][2]の値は「%d」です。\n",numbers[0][2]);
	printf("numbers[0][3]の値は「%d」です。\n",numbers[0][3]);
	printf("numbers[0][4]の値は「%d」です。\n",numbers[0][4]);

	return 0;
}

のようになります。

データ型 配列変数名[要素の個数][要素の個数]; 

と書くことで、「2次元配列」を作ることができます。

プログラムの出力結果は、

numbers[0][0]の値は「1」です。
numbers[0][1]の値は「2」です。
numbers[0][2]の値は「3」です。
numbers[0][3]の値は「4」です。
numbers[0][4]の値は「5」です。

のようになります。

この仕組みがどこでどのように使われるのかがイメージできないんですが、どうやって使うんだろうか。

こういう仕組みがあるのはわかったんだけど、具体的に利用例が思いつかないと、自分の中での「重要度」は低くなる傾向にある気がする。

「2次元配列」の具体例を考えてみる

身近なことをテーマにしながら、「2次元配列」がどのように利用できるのかをいろいろと考えていると、自分の購入した「音楽の曲データを表示する」みたいな例が思い浮かびました。

さっそくプログラムを書いてみると、

#include <stdio.h>

int main(void)
{
	char tune1[3][50] = {
		{"曲名1"},{"アーティスト名1"},{"購入日付"}
	};

	printf("tune1[0]の値は「%s」です。\n",tune1[0]);
	printf("tune1[1]の値は「%s」です。\n",tune1[1]);
	printf("tune1[2]の値は「%s」です。\n",tune1[2]);

	return 0;
}

のようになります。

このプログラムを実行すると、

tune1[0]の値は「曲名1」です。
tune1[1]の値は「アーティスト名1」です。
tune1[2]の値は「購入日付」です。

のように出力されます。

ここでハマったのが、「文字列も配列として扱う」というところ。

C言語で文字列を扱う場合は、

char tunesName[50];

のように作ることになり、「char型の配列」に「複数の文字(文字列)」を入れることで、文字列を作ることができます。

ここでも、気を付けないといけないことがあり、「50」と書いてある部分は格納する「文字列のバイト数」を表しています。

さらに「最後の文字」は「ヌル文字」と呼ばれる「文字列の最後」を表す文字を格納する必要があるため、実際に格納できる文字数は1文字分少なくなります。

文字列を扱うだけでも他の言語を扱うのにくらべて、いろいろと違いも多く、このあたりも独特な感じです。

「文字の配列」を作る時に、

char title[50] = "タイトル1";

のように配列に文字を代入することもできますが、この場合は、自動的に代入した文字の最後は、「ヌル文字」が自動的に追加されるようになっています。

いろいろとプログラムを書いて身に付けていくしか無さそうですね。

といいつつも、「C言語の配列」がまだ学びきれていないので、引き続き勉強していきたいと思います。

→「Twitter:@satoru78888」

HOMEへ