Этот вопрос предназначен для записи часто задаваемых вопросов для всех инициализаций / присваиваний между целочисленными и указательными проблемами.
Я хочу написать код, в котором указатель установлен на определенный адрес памяти, например, 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 (cl) говорит, что «инициализация
int*
отличается по уровням косвенности от int
».
Вопрос: Приведенные выше примеры действительны C?
И дополнительный вопрос:
Это не дает никаких предупреждений / ошибок:
int* p = 0;
Почему бы и нет?