@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;
Почему нет?