2009年1月24日土曜日

配列とポインタ

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