腕時計の沼、オーディオの沼、PCの沼。『タクジの沼』

配列

配列とは

プログラムで計算に使う値を保持しておくには、変数を使います。 変数とは、メモリ上で値を記憶する領域に付けた名前。 C言語では、メモリ上に領域を確保するには変数の宣言という作業が必要です。

データ型	変数名;

配列とは、同じ種類のデータを複数まとめて扱うことのできる変数です。

データ型	配列名[個数];

※変数と配列の一番の違いは、配列は[]の中に記述した個数分のデータを同じ名前で扱うことができます。

int	dat[5];
	↓
	dat[0] dat[1] dat[2] dat[3] dat[4]
	[]を添え字演算子、[]の中に記述した数値をインデックスまたは添え字と呼びます

繰り返し構造が利用できる

for文のカウンタと組み合わせて使用すると、効率よくすべての要素にアクセスすることができます。 カウンタの初期値を0、カウンタの増分を1にすると、処理を実行するたびにカウンタは0→1→2→3→4のように変化します。

カウンタ < 要素数
[例]
for ( i = 0; i < 100; i++ )

メモリの中身

変数や配列を宣言すると、メモリ上のどこかに値を保持するための領域が確保されます。 このアドレスは &変数名 で調べることができます。
※配列はメモリ上に連続して確保されます。

確保した領域の大きさはsizeof演算子で調べることができます。

配列の初期化

データ型	配列名[] = { 値1, 値2, 値3, … };
	配列に代入する初期値は{}で囲む。値の区切りはカンマ(,)

宣言した要素数よりも初期値が多いとエラーとなります。 逆に少ないと、足りない部分に0が代入されます。 要素数が初期値の数よりも優先されます。

配列を操作する

for文を配列のインデックスに使うと、すべての要素にアクセスすることができます。

for ( i = 0; i < 配列の要素数; i++ ){
	配列[i]の処理;
}

二次元配列

表形式のデータをそのまま扱うことのできる配列のことを指します。 配列がさらに縦方向に並んだものです。

int	dat[5][4];	/* dat[行のインデックス][列のインデックス] */
※要素数が4個の配列を5つ用意するという考え方

二次元配列でのメリット

  1. 配列名を減らすことができる
  2. 繰り返し構造を利用できる
  3. 行と列を自由に扱うことができる

配列の初期化

int	dat[2][3] = {
	{ 値00, 値01, 値02 },
	{ 値10, 値11, 値12 }
};
要素数が3個の配列を2つ用意

※初期値を代入するときに行数と列数を省略するとエラーになります。

[例]
int	dat[][] = {
	{ 1, 2, 3 },
	{ 4, 5, 6 }
};

列数が分かれば初期値は代入できる

二次元配列は要素数(列数)がn個の配列をx行文確保したもの。 行数を省略した場合、列数と代入する初期値の数から自動的に行数を判断します。

[例]
int	dat[][5] = {
	{ 1, 2, 3, 4, 5 },
	{ 6, 7, 8, 9, 10}
};
列数が5個、初期値の数が10なので、2行*5列の二次元配列

まとめると以下の通りです。

二次元配列全体にアクセスする方法

すべての要素にアクセスするには、二重の繰り返し構造を利用します。 外側の繰り返しは、行方向のループで内側の繰り返しは列方向のループになります。

for ( i = 0; i < 行数; i++ ){
	for ( j = 0; j < 列数; j++ ){
		配列[i][j]に対する処理;
	}
}
※改行コードを、列方向のループをすべて終了した後に出力