Для вычисления адреса не требуется доступ к памяти.&ptr->b
означает «дай мне адрес поля b
структуры, на которую указывает ptr
».Для этого не требуется смотреть на то, что может храниться в этой ячейке памяти.
Может быть полезно подумать об индексации массива, а не структуры.C определяет ptr[5]
как эквивалент *(ptr + 5)
, что означает, что &(ptr[5])
совпадает с &(*(ptr + 5))
.Теперь легко видеть, что &
и *
«отменяют» и оставляют вас с (ptr + 5)
, который включает только увеличение указателя, а не загрузку из памяти.немного облачно, потому что это отличает lvalues от rvalues.Таким образом, выражение, которое относится к памяти, обрабатывается по-разному в левой части выражения, чем в правой части.Учитывая оператор, подобный x = y;
, компилятор C загрузит значение с адреса y
и сохранит его по адресу x
.Это различие: y
неявно разыменовывается, а x
- нет.