Это кажется мне двусмысленным:
*p1->p2 *(p1->p2) or (*p1)->p2 *p1.a *(p1.a) or (*p1).a
Как компилятор интерпретирует такие выражения?
Это все до приоритет оператора .И ->, и . имеют более высокий приоритет, чем * (в этом контексте), поэтому два выражения эквивалентны:
->
.
*
*(p1->p2) *(p1.a)
Стрелка (->) и точка (.) имеют более высокий приоритет, чем оператор разыменования (*), поэтому она будет проанализирована как:
1) p1 - это указатель на структуру, которая содержит p2, а p2 - это указатель на то, что вы отменили.* (p1-> p2) 2) p1 - это переменная (не указатель) для структуры, которая содержит a, указатель, который вы отменяете.* (p1.a)
, подробнее см. C Приоритет и ассоциативность операторов