Давайте нарисуем ваши переменные:
+---+ +---+
| p | --> | a |
+---+ +---+
То есть p
указывает на a
.
Теперь, если вы сделаете &*p
, тогда вы сначала разыменуете p
чтобы получить a
, тогда вы получите адрес a
, который оставляет вас с указателем на a
.
Если мы возьмем *&p
, тогда вы получите адрес p
, чтобы получитьуказатель на p
, затем вы разыменовываете этот указатель, чтобы получить p
.Это указатель на a
.
Так что, хотя выражения делают разные вещи, конечный результат один и тот же: указатель на a
.
И компилятор спуска, вероятно, простовообще ничего не делать, так как оператор разыменования *
и оператор адреса &
вместе всегда взаимно уничтожают друг друга, независимо от того, в каком порядке они находятся.