Когда используется значение массива (в данном случае p
), оно неявно преобразуется в указатель на первый элемент (такой же, как &p[0]
).Такое преобразование называется затухающим.
Кроме того, первый элемент массива находится по тому же адресу, где находится массив.
p
распадается на &p[0]
.Это адрес первого элемента p
, который совпадает с адресом самого массива p
. *p
Здесь p
сначала уменьшается до &p[0]
, поэтому полноеВыражение эквивалентно *&p[0]
.*&
отменяет друг друга (по определению в C; C ++ использует другую формулировку, но эффект тот же). Таким образом, это lvalue до p[0]
, то есть первый элемент массива.В этом случае этот элемент является другим массивом, и поэтому его значение уменьшается до указателя на первый элемент (т. Е. &p[0][0]
).Поскольку адрес первого элемента совпадает с адресом массива, адрес p[0][0]
совпадает с адресом p[0]
, который совпадает с адресом p
. &*p
Как и прежде, &*
отменяют друг друга, и результат такой же, как при использовании только p
.
В памяти 2D-массив 4x4 выглядит следующим образом:
*
..0000111122223333..
XXXXXXXXXXXXXXXX
YYYY
Z
На этой диаграмме каждый столбец представляет область памяти.В столбцах, отмеченных X
, хранится двумерный массив.
Каждый столбец, отмеченный 0, является элементом первого подмассива, а каждый столбец с 1 - элементами второго подмассива и т. Д.
В столбцах, отмеченных Y
, хранится первый подмассив.
Столбец, отмеченный Z
, является первым элементом первого подмассива.
Как вы можете заметить,X
, Y
и Z
все начинаются с одного и того же адреса, помеченного *
.Это адрес массива, адрес первого подмассива и адрес первого элемента первого подмассива.