はじめての 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 されるだけです。