2012-10-13 1 views
2

Можно создать дубликат:
C: How come an array’s address is equal to its value?Не должен ли адрес массива быть двойным указателем?

int a[2]; 
printf("%u %u", (int)(&a), (int)(a)); 

Я имею в виду, что &a указатель, который указывает на адрес a. А второй a означает начальный адрес массива.

Почему они одинаковы?

+0

Зачем вводить адреса в ** подписи целых чисел **, а затем печатать их с использованием спецификатора формата ** unsigned int? ** У вас была одна работа! –

+0

После прочтения ссылки, я должен уважать & a [0] as & a? – Fionser

+0

@Fionser: Нет, '& a [0]' эквивалентно 'a' (кроме как операнд' & 'или' sizeof'). – caf

ответ

7

В любом контексте кроме случаев, когда это является операндом либо унарных & или sizeof операторов, имя массива a вычисляет указатель на первый элемент массива. Он имеет тип int *.

В &a, a все еще обозначает сам массив, так &a это адрес массива. Он имеет тип int (*)[2].

Поскольку первый элемент массива находится в начале массива, адрес массива и адрес первого элемента обязательно совпадают, поэтому вы видите одно и то же значение.

(Действительно, вы должны использовать спецификатор формата %p для печати указателей).

0

&a - базовый адрес массива, который является постоянным. а также то, что a содержит первый элемент.

2

Это потому, что все они указывают на тот же адрес.

  • &a это адрес a
  • a является сам массив (начало его)
  • &a[0] также тот же адрес, потому что это первый элемент

Так что, если вам всегда приводите эти примеры к int, это будет адрес a. Из-за того, что первый элемент массива всегда находится в его начальном адресе, поскольку только a указывает на его первый элемент, если он правильно выбран.

Смежные вопросы