Dlaczego tak
Operator -> łączy wyłuskanie wskaźnika z dostępem do składowej i jest równoważny zapisowi (*p).x. Zapis p.x jest błędny, bo kropka wymaga obiektu, a p jest wskaźnikiem. W zapisie *p.x kropka ma wyższy priorytet niż *, więc kompilator próbuje najpierw p.x, co również jest błędem; operator :: służy do odwołań przez nazwę klasy lub przestrzeni nazw, a nie przez obiekt.