Так что какое-то время я путался с именами массивов и указателями.
Мы заявляем int a[10];
И где-то в будущем также есть a
и &a
.
Итак, я понял, как работает синтаксис. a
- имя массива. Когда он не используется в качестве операнда для sizeof
&
и т. Д., Он будет преобразован или "распаден", поэтому он возвращает указатель на целое число, содержащее адрес первого элемента массива.
Если имя массива используется в качестве операнда для sizeof
или &
, его тип равен int (*)[10]
. Поэтому я думаю, что тип отличается, потому что этот "распад" не происходит.
Но я до сих пор не понимаю, как работает &a
. Насколько я понимаю, он дает мне адрес whatever it was before the "decay" happened
.. Итак, до того, как произойдет «затухание» указателя, что это такое и как компилятор работает с «оригиналом» для оценки &a
?
Для сравнения, если мы объявим int *p;
и позже есть &p
и p
где-то в коде ...
В этом случае указателю на целое число p
присваивается отдельная ячейка указателя со своим адресом, и значением по этому адресу будет любой адрес, который мы ему присвоим (или значение мусора при этом предварительном назначении адреса).
a
не получает отдельной ячейки указателя в памяти, когда она объявлена int a[10]
. Я слышал, это идентифицируется со смещением в регистре %ebp
. Тогда что происходит с компилятором, когда он оценивает &a
? «Распад» на указатель на целое число не происходит, во-первых, отдельного «указателя» не было. Тогда что компилятор идентифицирует a
как и что он делает, когда видит, что унарный оператор &
использует имя массива в качестве операнда?