はじめての C

Arrays and Pointers in C

K&R の、配列を ポインタへ 変換する 方式

K&R では、コンパイラの コードで 配列等式を 隠すよりも それを 表にだして、配列と ポインタが まとまって 処理されるよう 設計を 試みました。

そこでは、少し わかりにくいけれど、一つの 適切な 解決法を 見つけました。

この 「面倒な」 配列等式は、その構成を 4つの ルールに 取り換えられます。

1) N次元の 配列は、(N - 1)次元の 配列を 要素とする 1次元配列である。

2) ポインタの 付加は、このように 定義される。

ptr # n = ptr + n * size(type-pointed-into)

"#" は、通常の 付加分との 混乱を 避けるため、ここでは、ポインタの 付加を 表します。

関数 size() は、オブジェクトサイズを 返しています。

3) 有名な 「減算変換 decay convention」

配列は、その配列の 最初の 要素を 指す ポインタとして 処理される。

減算変換は、同じ オブジェクトには、再度 適用されることは ありません。

4) 添字に i の 値を とることは、次の 操作 - i を ポインタに 加え、次に 型を 間接参照して type-dereference 合計する - に 等しい、つまり、

xxx[i] = *(xxx # i)

ルールの (4) と (3) が、同時に 再帰的に 適用される (これは 多次元配列の 場合です) ときには、最後の ステップを 除けば、ポインタの 値でなく、単に データ型が 間接参照 dereference されるだけです。