Ответ 1
Обычный array
затухает до указателя на его первый элемент, он равен &array[0]
. Первый элемент также начинается с того же адреса, что и сам массив. Отсюда &array == &array[0]
.
Но важно отметить, что типы разные:
- Тип
&array[0]
(в вашем примере)int*
. - Тип
&array
-int(*)[5]
.
Отношения между &array[0]
и &array
могут быть проще, если я покажу это немного "графически" (с добавленными указателями):
+----------+----------+----------+----------+----------+ | array[0] | array[1] | array[2] | array[3] | array[4] | +----------+----------+----------+----------+----------+ ^ | &array[0] | &array
В качестве дополнительного приложения, array
затухает до указателя на его первый элемент, то есть array
затухает до &array[0]
и, таким образом, будет иметь тот же тип.
Вещи разные с указателями, хотя. Указатель pArray
указывает на некоторую память, значение pArray
является местоположением этой памяти. Это то, что вы получаете, когда используете pArray
. Это также как &pArray[0]
.
Когда вы используете &pArray
, вы получаете указатель на указатель. То есть вы получаете местоположение (адрес) самой переменной pArray
. Его тип - int**
.
Несколько графически с указателем pArray
было бы что-то вроде этого
+--------+ +-----------+-----------+-----------+-----------+-----------+-----+ | pArray | ----> | pArray[0] | pArray[1] | pArray[2] | pArray[3] | pArray[4] | ... | +--------+ +-----------+-----------+-----------+-----------+-----------+-----+ ^ ^ | | &pArray &pArray[0]
[Обратите внимание на ...
в конце "массива", потому что указатели не сохраняют информацию о памяти, на которую он указывает. Указатель указывает только на определенное место, "первый" элемент "массива". Обрабатывать память как "массив" - дело программиста.]