Два оператора не эквивалентны даже с точки зрения компилятора. Оператор p.age
преобразуется в адрес p
+ смещение age
, а pp->age
преобразуется в адрес , содержащийся в pp
+ смещение age
.
Адрес из переменной и адрес , содержащийся в (указатель) переменной - это очень разные вещи.
Скажем, смещение возраста равно 5. Если p
является структурой, ее адрес может быть 100, поэтому p.age
ссылается на адрес 105.
Но если pp
является указателем на структуру, ее адрес может быть 100, но значение, хранящееся по адресу 100, не является началом person
структуры, это указатель. Таким образом, значение по адресу 100 (адрес , содержащийся в pp
) может быть, например, 250. В этом случае pp->age
ссылается на адрес 255, а не на 105.