Учитывая декларацию
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 ray), но значения типов отличаются.
Поэтому, учитывая вышеупомянутую декларацию, выражение a[0]
имеет тип T [M]
(M
-элементные массив T
), который «затухает», чтобы ввести T *
, если это не операнд оператора sizeof
. Выражение &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++;
затем p0
будет содержать адрес a[0][1]
, а p1
содержит адрес a[1][0]
. p0++
авансы p0
, чтобы указать на следующий объект типа T
, а p1++
авансы p1
, чтобы указать на следующий объект типа T [M]
.
ТЕПЕРЬ Я ПОНИМАЮ ВСЕ ЭТО. Благодаря! –