@chux no, только 0 является константой нулевого указателя.

вопрос предназначен для записи часто задаваемых вопросов для всех вопросов инициализации / присваивания между целочисленными значениями и указателями.

Я хочу сделать код записи, где указатель установлен на конкретный адрес памяти, например0x12345678, Но при компиляции этого кода с помощью компилятора gcc я получаю «предупреждение / ошибки инициализации делает указатель из целого числа без приведения»:

int* p = 0x12345678;

Точно так же этот код дает «инициализация делает целое число из указателя без приведения»:

int* p = ...;
int i =  p;

Если я делаю то же самое за пределами строки объявления переменной, сообщение остается тем же, но вместо «инициализации» говорится «присваивание»:

p = 0x12345678; // "assignment makes pointer from integer without a cast"
i = p;          // "assignment makes integer from pointer without a cast"

Тесты с другими популярными компиляторами также дают сообщения об ошибках / предупреждениях:

clang говорит "несовместимое преобразование целого числа в указатель"ICC говорит "значение типаint нельзя использовать для инициализации объекта типаint*"MSVC (кл) говорит "инициализацияint* отличается уровнем косвенности отint».

Вопрос: являются ли приведенные выше примеры действительными C?

И дополнительный вопрос:

Это не дает никаких предупреждений / ошибок:

int* p = 0;

Почему нет?