はじめての 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)
これは 正確な 配列等式である。 証明終わり。