int a[]={5,6,7,8};
int *p= a;
Обратите внимание, что в случае массивов (в большинстве случаев), скажем, массив a
, ADDRESS_OF
a
такой же, как ADDRESS_OF
первый элемент массива .ie, ADDRESS_OF(a)
такой жекак ADDRESS_OF(a[0])
.&
является оператором ADDRESS_OF
и, следовательно, в случае массива a
, &a
и &a[0]
являются одинаковыми.
Я уже подчеркивал, что в большинстве случаев имямассив преобразуется в адрес своего первого элемента;Единственное известное исключение - это когда он является операндом sizeof, что очень важно для работы с malloc.Другой случай, когда имя массива является операндом оператора & address-of.Здесь он преобразуется в адрес всего массива .Какая разница?Даже если вы думаете, что адреса будут в некотором роде «одинаковыми», критическое различие заключается в том, что они имеют разные типы.Для массива из n элементов типа T адрес первого элемента имеет тип указатель на T;адрес всего массива имеет тип «указатель на массив из n элементов типа T»;явно очень разные.
Вот пример этого:
int ar[10];
int *ip;
int (*ar10i)[10]; /* pointer to array of 10 ints */
ip = ar; /* address of first element */
ip = &ar[0]; /* address of first element */
ar10i = &ar; /* address of whole array */
Для получения дополнительной информации вы можете обратиться The C Book.