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