配列とポインタの私的まとめ

まず、配列とポインタは明確に別物である。


ただし、a[n]は*(a + n)と等価である。
a[n]と書けるならば*(a + n)とも書けるし、
*(a + n)と書けるならばa[n]とも書ける。


こうした意味では配列とポインタは密接な関係を持つが、
ポインタ変数と配列変数は明確な違いを持つ。


ポインタ変数は対象となる変数の場所(アドレス)を格納可能な変数であり、
配列変数は配列の領域を確保し、
配列としての名前を持つ変数である。


ポインタは代入可能だが、
配列名に対し代入することはできない。
すなわち、
int* p;
は代入を赦すが、
int a[10];
と宣言されている場合にaに対する代入は赦されない。
(a[0]やa[1]にはもちろん代入できる)

また、
配列自身を関数に渡すことはできず、
関数に渡されるのはその配列のアドレスとなる。
よって、関数側では受け取ったのがポインタであるとして解釈しても良い、
ということになっている。


しかし、
ポインタのポインタと、
配列に対するポインタは別物であるため、


多次元配列(配列の配列)に関しては、
int a[10][10];
などと宣言した場合は、
void func(int** array)
では受けられず、

void func(int array[10][10])
void func(int array[][10]) // 先頭の要素を省略可
void func(int (*array)[10]) // 配列へのポインタであると解釈しても可

と受けなければならない。