Обычный 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]
и, следовательно, будет иметь то же самоеtype.
Однако с указателями все иначе.Указатель pArray
указывает на некоторую память, значение pArray
- это местоположение этой памяти.Это то, что вы получаете, когда используете pArray
.Это также то же самое, что и &pArray[0]
.
Когда вы используете &pArray
, вы получаете указатель на указатель .То есть вы получаете местоположение (адрес) самой переменной pArray
.Его тип int**
.
Несколько графически с указателем pArray
это будет примерно так:
+--------+ +-----------+-----------+-----------+-----------+-----------+-----+
| pArray | ----> | pArray[0] | pArray[1] | pArray[2] | pArray[3] | pArray[4] | ... |
+--------+ +-----------+-----------+-----------+-----------+-----------+-----+
^ ^
| |
&pArray &pArray[0]
[Обратите внимание на ...
в конце«массив», потому что указатели не сохраняют информацию о памяти, на которую он указывает.Указатель указывает только на определенное место, «первый» элемент «массива».Обрабатывать память как «массив» - дело программиста.]