5-1 配列

この記事は約6分で読めます。

配列とは

同じ型の変数を複数使いたい時、配列を使用することができます。配列を使用する際も変数を使用する時と同じように定義をする必要があります。定義の仕方は

型名 配列名[要素数];

です。要素数とは配列の中に変数が含まれている数です。配列に含まれている一つ一つの変数をそれぞれ要素と言います。要素にアクセスするときは、

配列名[添え字];

と書きます。要素数または添え字をつけるところ以外は普通の変数を同じように使えます。配列の添え字は0から始まります。つまり要素数10で宣言したときは添え字は0から9となります。

サンプルコード

#include <stdio.h>
int main(void){
	int i,num[10];
	for (i=0;i<10;i++){
		printf("%d番目の数字を入力してください。",i);
		scanf("%d",&num[i]);
	}
	for (i=0;i<10;i++){
		printf("%d番目の数字:",num[i]);
	}
	return 0;
}

実行結果

0番目の数字を入力してください。2
1番目の数字を入力してください。4
2番目の数字を入力してください。89
3番目の数字を入力してください。1
4番目の数字を入力してください。0
5番目の数字を入力してください。5
6番目の数字を入力してください。-5
7番目の数字を入力してください。4
8番目の数字を入力してください。8
9番目の数字を入力してください。1
0番目の数字:2
1番目の数字:4
2番目の数字:89
3番目の数字:1
4番目の数字:0
5番目の数字:5
6番目の数字:-5
7番目の数字:4
8番目の数字:8
9番目の数字:1

int型の要素数10の配列numを定義しました。添え字は0から9です。scanf関数を使うときは普通の変数と同様に&を付けなければなりません。

配列を定義するときの注意点

配列の添字には変数を使うことができるので配列とfor文は非常に相性が良いです。しかし配列を定義するときの要素数に変数を使用することはできません(第8章で説明します)。

#include <stdio.h>
int main(void){
	int i,youso;
	scanf("%d",&youso);
	int num[youso];
	for (i=0;i<youso;i++){
		printf("%d番目の数字を入力してください。",i);
		scanf("%d",&num[i]);
	}
	for (i=0;i<youso;i++){
		printf("%d番目の数字:%d\n",i,num[i]);
	}
	return 0;
}

実行結果

コンパイルエラーにより実行できません
エラー表示(筆者の環境の場合)
エラー 5行目 ここでは宣言はできない(関数 main )
エラー 5行目 定数式が必要(関数 main )

配列の要素数に変数をしていしているのでコンパイルできません。さらに、C言語では変数及び配列は先頭でしか宣言できないので、2つコンパイルエラーとなります。

また、配列の一つの要素に数値を代入することはできますが、配列同士を代入することはできません。

配列の初期化

変数を定義する時に初期化できるのと同様に、配列を定義する時に配列を初期化することもできます。

#include <stdio.h>
int main(void){
	int i,ar1[5]={5,3,8,5,9};
	int ar2[5]={1,2,3};
	int ar3[]={-5,0};
	for (i=0;i<5;i++){
		printf("ar1[%d]=%d\n",i,ar1[i]);
	}
	for (i=0;i<5;i++){
		printf("ar2[%d]=%d\n",i,ar2[i]);
	}
	for (i=0;i<2;i++){
		printf("ar3[%d]=%d\n",i,ar3[i]);
	}
	return 0;
}

実行結果

ar1[0]=5
ar1[1]=3
ar1[2]=8
ar1[3]=5
ar1[4]=9
ar2[0]=1
ar2[1]=2
ar2[2]=3
ar2[3]=0
ar2[4]=0
ar3[0]=-5
ar3[1]=0

配列を初期化する時の初期化子は中カッコ{}の中に入れます。初期化子の数が要素数に足りない時は0で初期化されます。初期化子の数が要素数より多い場合はコンパイルエラーとなります。初期化子が適切に設定されている場合は要素数を指定せずに定義することが可能です。要素数は初期化子と同じ数になります。このプログラムでは配列ar3の要素数は初期化子の数と同じ2になります。

要素数の確認

sizeof演算子は変数のメモリ上のバイト単位のサイズを求めるものです。配列に対してsizeof演算子を使用すると配列全体のサイズが求まります。配列全体のサイズを要素一つのサイズで割ると要素数をプログラム中から求めることができます。

#include <stdio.h>
int main(void){
	int i,ar1[5]={5,3,8,5,9};
	int ar2[5]={1,2,3};
	int ar3[]={-5,0};
	printf("sizeof int=%d\n",sizeof(int));
	printf("sizeof ar1=%d,sizeof ar1[0]=%d,要素数=%d\n",sizeof ar1,sizeof ar1[0],sizeof ar1/sizeof ar1[0]);
	printf("sizeof ar2=%d,sizeof ar2[0]=%d,要素数=%d\n",sizeof ar2,sizeof ar2[0],sizeof ar2/sizeof ar2[0]);
	printf("sizeof ar3=%d,sizeof ar3[0]=%d,要素数=%d\n",sizeof ar3,sizeof ar3[0],sizeof ar3/sizeof ar3[0]);
	return 0;
}

実行結果

sizeof int=4
sizeof ar1=20,sizeof ar1[0]=4,要素数=5
sizeof ar2=20,sizeof ar2[0]=4,要素数=5
sizeof ar3=8,sizeof ar3[0]=4,要素数=2

まとめ

配列を使用すると、同じ型の変数を複数個同時に使用できる。

ループ変数を添え字にすると、配列のすべての要素に対して操作を行える。

添字が0から始まること、要素数に変数を指定できないことに注意。

コメント