Учитывая объявление массива T a[N]
, выражение &a
имеет тип "указатель на массив N-элементов T
(T (*)[N]
), а его значение является базовым адресом массива. В этом отношении унарный оператор &
ведет себя так же для массивов, как и для любого другого типа данных.
Что удивительно, так это то, как C обрабатывает выражение массива a
. За исключением случаев, когда он является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым для инициализации другого массива в объявлении, выражение массива типа "массив N-элементов из T
" (T [N]
) будет заменено ("decay to") выражением указателя типа "pointer to T
" (T *
), а его значением будет адрес первого элемента массива. IOW, a == &a[0]
.
Поскольку адрес первого элемента массива совпадает с базовым адресом всего массива, выражения a
и &a
выдают одинаковое значение , но типы различаются (T *
в отличие от T (*)[N]
).