=== 5. 配列 ==========================

配列とは、同じ型のオブジェクトを並べ、0から始まる番号をつけたもの。配列のサイズは0より大きく、コンパイル時に定まる定数でなくてはなりません。

配列の要素の参照

配列aの最初の要素を参照するには、a[0]とかく。配列の要素は0から始まる。(0オリジン)

配列全体への参照は不可能

配列全体へまとめて代入することはできません。配列全体を関数へ引数として渡すことはできません。配列全体を関数の戻り値とすることはできません。
ただし、配列全体をまとめて初期化することはできます。
配列の宣言では配列のサイズを指定しないこともできます。このような配列は不完全な型と呼ばれています。

多次元配列

多次元配列 多次元配列は、配列の要素がさらに配列であるような配列です。例えば、int a[3][4]は、3行4列の整数の2次元配列を表します。 単体の配列は、メモリ上では必ず連続した領域に確保されます。多次元配列は、1次元配列の要素は必ず連続でそれ以外は規定されていませんが、ほとんどのコンパイラでは連続した領域に確保されます。

配列の初期化

配列は定義時に初期化することができます。要素数が決定できる時には、一番左にある要素数に限り配列の大きさを省略することができます。

int a [] = {1, 2, 3}  
int b [][3] = {  
	{1, 2, 3},  
	{4, 5, 6},  
}

配列とポインタ

配列とポインタの違い

char *pa[] = {"abcde", "fg", "hij", ""};  
char aa[][6] = {"abcde", "fg", "hij", ""};

配列paと配列aaは、普通に参照する上ではほぼ同じだが、メモリ上では全く異なる。

配列のメモリレイアウト

個々の配列が連続したメモリ領域であることは規格で決められている。処理系依存だが全てが連続することも多い。
paに比べて、aaの方が文字を格納する分として広いメモリ領域を使っていることがわかる

配列と構造体の違い

配列は同じ型の変数を集めて番号をつけたものであり、構造体は異なる型の変数を集めて名前をつけたもの。