はじめての C

Arrays and Pointers in C

K&R の ルールは 配列等式を 意味する

それでは、2次元配列の 場合に、上のルール (再帰的に 適用する) の 結果が 配列等式であることを 示してみましょう。

   mat[i]    = *(mat # i)          (ルール 4)

mat[i][j] = *(*(mat # i) # j) (ルール 4)

"mat" は 明らかに T型の 2次元配列であり、ルール 3 に 従って、「T型の 列 row への ポインタ」 へと 減算 decay される。 そして、配列等式の 最初の 2つの 項が 得られる。

   mat[i][j] = *(*(mat + i * sizeof(row)) # j)
Pointer to row of T

(mat # i) の 型を 間接参照することで、「T型の 列 row」 が 得られる。

   mat[i][j] = *((mat + i * sizeof(row)) # j)
Row of T

このとき、ポインタ付加分を 1つ 左に もっているので、再び 「減算変換」 を 用いて、1次元配列の 「T型の 列」 を その最初の 要素、つまり 「T への ポインタ」 に していく。

この ポインタ付加を 実行すれば、配列等式の 3つ目の 項が 得られる。

   mat[i][j] = *(mat + i * sizeof(row) + j * sizeof(T))
Pointer to T

address(mat[i][j]) = mat + i * sizeof(row) + j + sizeof(T)
Pointer to T

"mat" が 実際に その配列の 最初の 要素を 指していることを 覚えていれば、これは 次のように 書くことが できる。

   address(mat[i][j]) = address(mat[0][0]) +
i * sizeof(row) +
j * sizeof(T)

これは 正確な 配列等式である。 証明終わり。