にカラムi
内の各要素は、宣言
T a[N][M]; // for any type T
を考えると、次の該当する:
Expression Type Decays to Value
---------- ---- --------- -----
a T [N][M] T (*)[M] Address of a[0]
&a T (*)[N][M] n/a Address of a
*a T [M] T * Address of a[0][0]
a[i] T [M] T * Address of a[i][0]
&a[i] T (*)[M] n/a Address of a[i]
*a[i] T n/a Value of a[i][0]
a[i][j] T n/a Value of a[i][j]
&a[i][j] T * n/a Address of a[i][j]
a
、&a
、a[0]
、&a[0]
、及び&a[0][0]
全て値(配列のアドレスは、arの最初の要素のアドレスと同じです。 X線)のタイプのが異なります。
したがって、上記の宣言が与えられ、式a[0]
は、sizeof
演算子のオペランドでない限りT *
を入力するために「崩壊」は、T [M]
(T
のM
-element配列)を入力しています。式&a[0]
は、タイプT (*)[M]
(ポインタ〜M
〜要素配列T
)です。
が宣言最初
T a[N][M];
T *p0 = a[0];
T (*p1)[M] = &a[0];
を想定、p0
とp1
は同じ値(a[0][0]
のアドレス)を含みます。私たちは、次のコード実行した場合しかし、:
p0++;
p1++;
をp1
がa[1][0]
のアドレスが含まれていながら、その後p0
は、a[0][1]
のアドレスが含まれています。 p0++
の次のオブジェクトを指すようにp0
を進める一方で、p1++
は、T [M]
の次のオブジェクトを指すようにp1
を進める。
今私はそれをすべて理解しています。ありがとう! –