В C, в чем разница между указателем NULL и указателем, который указывает на 0?В C есть разница между указателем NULL и указателем, который указывает на 0? Если да, то?
ответ
ISO/IEC 9899: TC2 состояния в 6.3.2.3 Pointers
3 целочисленное постоянное выражение со значением 0, или такое выражение преобразованный к типу пустот *, называется пустой указатель constant.55) Если константа указатель NULL преобразуется в тип указателя, в результате указатель, называемый нулевой указатель, гарантированно сравнить с неравными указатель на любой объект или функции
макрос NULL, расширяет до значения , определяемой реализацией константа нулевой указатель.
Любые два нуль-указателя должны сравнивать одинаковые.
Да, есть. Стандарт диктует, что NULL
всегда указывает на недопустимую память. Но он не указывает, что целочисленное представление указателя должно быть 0. Я никогда не сталкивался с реализацией, для которой NULL
был отличным от 0, но это не предусмотрено стандартом.
Обратите внимание, что назначение указателя 0
указателю не означает, что указатель принимает целочисленное представление 0. Это означает, что значение специального указателя нулевой переменной присваивается переменной указателя.
Оценка литерала 0
в контексте указателя идентична NULL
. Какой бы бит шаблон, используемый компилятором для представления указателя NULL
, скрыт.
У старого comp.lang.c FAQ есть большой раздел по нулевому указателю, и его стоит прочитать.
Идея заключается в том, что NULL
указатель должен каким-то образом представляют собой область памяти, что является недопустимым.
Так как в нижних сегментах памяти отображается код ОС, используется значение 0 (для представления указателя NULL), так как эта область в памяти не принадлежит к пользовательской программе, а сопоставляется с кодом ОС.
- 1. В чем разница между указателем void и указателем NULL?
- 2. Разница между константным указателем и указателем на константу в C
- 3. В чем разница между указателем C и указателем Objective C?
- 4. Разница между указателем на указатель и указателем на массив?
- 5. Разница между нормальным указателем и указателем const в c
- 6. Разница между указателем инициализациями
- 7. разница между указателем и адресом
- 8. Разница между указателем char и указателем на char?
- 9. Разница между указателем байт и байтом управляемого указателем
- 10. Разница между указателем (*) И ссылкой (&)
- 11. В чем разница между указателем и ручкой
- 12. Разница между массивом и указателем
- 13. В чем разница между нулевым указателем и указателем void?
- 14. В чем разница между указателем на int и указателем на указатель на int в C++?
- 15. В чем разница между указателем на функцию и указателем на функцию WINAPI?
- 16. Разница между указателем и его адресом
- 17. Адрес 0 заменяется указателем NULL на HCS08
- 18. Разница между строковым указателем и строковым массивом
- 19. Передача между указателем на элемент и указателем на константу
- 20. В чем разница между ссылкой и указателем?
- 21. Разница между указателем и массивом в памяти
- 22. В чем разница между указателем на 2D-массив и указателем на 2D-массив?
- 23. Разница между указателем в C++ и ссылочным типом в C#
- 24. В чем разница между указателем на массив и указателем на указатель?
- 25. Какая разница между нормальным указателем и самореляционным указателем на языке c
- 26. Разница между «указателем на функцию» и «указателем на функцию» на языке C
- 27. разница между двойным указателем и массивом указателей
- 28. В чем разница между указателем и строками?
- 29. Предупреждение при литье типов между указателем и указателем на функцию
- 30. Разницы между структурой и указателем на структуру
относящийся: http://c-faq.com/null/machexamp.html – nos
Также обратите внимание, что 'int * ptr = 0;' всегда выводит нулевой указатель благодаря специальному правилу, потому что '0' является так называемая «константа нулевого указателя». Это выполняется, даже если вы находитесь в какой-то особой реализации, где нулевой указатель отличается от адреса 0. Однако 'int i = 0; int * ptr = (int *) i; 'не обязательно приводит к нулевому указателю. Таким образом, вы обычно не сталкиваетесь с «указателем, указывающим на адрес 0», за исключением контекста, где он является нулевым указателем, но стандарт разрешает его. –
@ Давид, в вашем втором пункте вы подразумеваете «не», не так ли? И «NULL» всегда является значением «0» по определению стандарта, который может быть допустимым адресом, например, в ядре. Поэтому лучше лучше отличить «NULL» от внутреннего представления нулевого указателя, который, как вы говорите, может быть чем-то другим. –