Я играл с gcc и пробовал следующий бит кода:
int A = 42;
int *B = &A;
int *C = &*B;
И C == &A, как и ожидалось. Но когда я пытаюсь:
int *B = NULL;
int *C = &*B;
Выключает C == NULL, а не segfault. Таким образом, &*B не является разыменованием B, прежде чем принимать его адрес.
Я предполагаю, что препроцессор удаляет экземпляры &* и *&, прежде чем они даже попадут в компилятор, поскольку они отрицают друг друга, но я не могу найти документацию, чтобы проверить, является ли это стандартным C или компилятор конкретного.
Заканчивается ли препроцессор &* и *&, и можно ли ожидать этого поведения от любого данного компилятора?