- 配列
- メモリ上に、1要素が型のサイズである連続領域を作成。
- 規格より、要素は必ず連続領域にあることが保証されている。
- 配列の識別子だけ書くと、配列の実体への参照(配列そのもの)を指す。
- 多次元配列も、結局は、型サイズの一次元配列として扱う。
- 式中の配列への参照は、例外を除き、その型の先頭要素へのポインタに成り下がる。
- 要素数は、定数しか認められていない(動的確保は不可能である)。
- ポインタ
- アドレスを格納し、型でサイズを表わす。
- 間接参照演算子*を付加すると、ポインタの指す先への参照となる。
- ポインタに加算すると型のサイズだけ増える。
array[A][B] は *(*(array + A) + B) と結果的に同等である。
但し(0 <= A < M)&&(0 <= B < N)ってことで^^;
- 2次元配列とはいえ、結局int[N]型で要素数Mの一次元配列と考える。
- そうなるとarrayは、int[N]型配列の参照(そのもの、配列全体、要素全部)である。
- int[N]型配列の参照は、その型の先頭要素へのポインタに成り下がるから、すぐint[N]*型ポインタとなる。
- int[N]*型ポインタにAを加算する。
- int[N]*型ポインタの参照は、int[N]型の変数の実体である。
- そういえばint[N]型の変数は、int型で要素数Nの配列だったね。
- int型配列への参照は、その型の先頭要素へのポインタに成り下がるから、すぐint*型ポインタとなる。
- int*型ポインタにBを加算する。
- int*型ポインタの参照は、int型の変数の実体である。おめでとう。