Возможно, это удивительно, что можно действительно принять адрес целого массива, отчасти потому, что ему не нужно очень часто. Массив в некотором смысле является единственным объектом, который имеет один адрес, который является адресом его первого байта. Как и для всех объектов, адрес получается с помощью оператора адреса, &
.
Элемент элемента массива (как и все его элементы) имеет адрес, также являющийся адресом его первого байта. Указатель на его первый элемент - это то, что тип массива «настраивается», когда он передается в качестве аргумента функции.
Эти два байта идентичны и имеют один и тот же адрес. Но они имеют разные типы, что становится очевидным, если вы добавите 1 к ним и распечатаете их снова.
Указатель y
, напротив, является его собственным отдельным объектом (возможно, размером 4 или 8 байт, достаточным для хранения в нем адреса). Как и любой объект, он имеет адрес, который может быть получен с помощью оператора &
. Возможно, смутно, он также содержит адрес, в этом случае адрес первого байта массива. Эти два, конечно, не равны: объект-указатель находится в другом месте, чем массив (а именно, рядом с ним в стеке, даже если Олафу это не нравится).
Незначительное замечание: вы используете %p
для печати указателей, что хорошо. Если вы это сделаете, вы должны строго придерживаться указателя, который вы печатаете, указателем на пустоту: printf("%p\n", (void *)x);
.
Возможный дубликат [Как адрес массива равен его значению в C?] (Http://stackoverflow.com/questions/2528318/how-come-an-arrays-address-is-equal-to- его значение-в-в) – Sneftel
C не требует использования стека для автоматических переменных. Это конкретная реализация. И массив не является указателем. – Olaf
@Olaf - это реализация, специфическая, поскольку все реализации специально выделяются в стек ;-). –