( Пожалуйста, прочтите этот абзац, прежде чем читать сообщение.Я прошу всех, кто заинтересован в чтении этого сообщения, постарайтесь прочитать его внимательно и, конечно, не понижайте его, пока не поймете полностью, спасибо. )
Теперь это вики сообщества, поэтому, если кто-то не согласен с какой-либо концепцией, пожалуйста, измените ее, с четким и подробным объяснением того, что не так и почему, и, если возможно, укажите источники или предоставьте доказательства, которые можно воспроизвести.
Ответ
Вот несколько других причин, которые могут быть основными факторами для NULL == 0
- Тот факт, что ноль - это ложь, поэтому можно делать прямо
if(!my_ptr)
вместо if(my_ptr==NULL)
.
- Тот факт, что неинициализированные глобальные целые числа по умолчанию инициализируются всеми нулями, и поэтому указатель всех нулей будет считаться неинициализированным.
Здесь я хотел бы сказать несколько слов о других ответах
Не из-за синтаксического сахара
Утверждение, что NULL равно нулю из-за синтаксического сахара, не имеет особого смысла, если да, то почему бы не использовать индекс 0 массива для хранения его длины?
На самом деле C - это язык, который больше всего напоминает внутреннюю реализацию, имеет ли смысл говорить, что C выбрал ноль только из-за синтаксического сахара? Они предпочли бы предоставить ключевое слово null (как это делают многие другие языки), а не отображать ноль в NULL!
Таким образом, хотя на сегодняшний день это может быть просто синтаксический сахар, ясно, что первоначальное намерение разработчиков языка C не было для синтаксического сахара, как я покажу далее.
1) Спецификация
Тем не менее, хотя это правда, что спецификация C говорит о константе 0 как о нулевом указателе (раздел 6.3.2.3), а также определяет NULL как определяемую реализацию (раздел 7.19 в спецификации C11 и 7.17 в спецификации C99), Факт остается фактом, что в книге "Язык программирования C", написанной изобретателями C, в разделе 5.4 говорится следующее:
C гарантирует, что ноль никогда не является допустимым адресом для данных, поэтому возвращаемое значение нуля может использоваться для сигнализации об аномальном событии, в данном случае без пробела.
Указатель и целые числа не взаимозаменяемы, единственное исключение - ноль: постоянный ноль может быть назначен указателю, а указатель может сравниваться с постоянным нулем. Символическая константа NULL часто используется вместо нуля как мнемоника, чтобы более четко указать, что это специальное значение для указателя. NULL определяется в. В дальнейшем мы будем использовать NULL.
Как видно (из слов «нулевой адрес»), по крайней мере, первоначальным намерением авторов C был адрес ноль, а не постоянный ноль, более того, из этого отрывка следует, что причина, по которой спецификация говорит из Константа ноль, вероятно, не исключает выражение, которое оценивается как ноль, а вместо этого включает целочисленную константу ноль как единственную целочисленную константу, разрешенную для использования в контексте указателя без приведения типов.
2) Резюме
Хотя в спецификации явно не говорится, что нулевой адрес может обрабатываться иначе, чем нулевая константа, в ней не говорится, что нет, и тот факт, что при работе с константой нулевого указателя он не утверждает, что это реализация, определенная как действительно с помощью константы, определенной NULL , вместо того, чтобы заявлять, что она равна нулю, показывает, что может быть разница между нулевой константой и нулевым адресом.
(Однако, если это так, мне просто интересно, почему NULL определяется реализацией, поскольку в таком случае NULL также может быть постоянным нулем, поскольку компилятор в любом случае должен преобразовать все нулевые константы в фактическую реализацию, определенную NULL?)
Однако я не вижу этого в реальных условиях, и на обычных платформах нулевой адрес и постоянный ноль обрабатываются одинаково и выдают одно и то же сообщение об ошибке.
Более того, факт в том, что современные операционные системы фактически резервируют всю первую страницу (диапазон от 0x0000 до 0xFFFF), просто чтобы предотвратить доступ к нулевому адресу из-за указателя NULL в C (см. Http://en.wikipedia.org/wiki/ Zero_page , а также «Windows Via C / C ++ Джеффри Рихтера и Кристофа Насара (опубликовано Microsoft Press)»).
Таким образом, я бы попросил любого, кто заявляет, что он действительно видел это в действии, указать платформу, компилятор и точный код, который он фактически сделал (хотя из-за нечеткого определения в спецификации [как я показал] любой компилятор и платформа может делать все, что хочет).
Однако очевидно, что авторы C не имели этого в виду, и они говорили о «нулевом адресе» и о том, что «C гарантирует, что это никогда не будет действительным адресом», а также «NULL - это просто мнемоника ", ясно показывая, что это первоначальное намерение не было для" синтаксического сахара ".
Не из-за операционной системы
Также утверждается, что операционная система запрещает доступ к нулевому адресу по нескольким причинам:
1) Когда был написан C, такого ограничения не было, как можно увидеть на этой странице википедии http://en.wikipedia.org/wiki/Zero_page .
2) Дело в том, что компиляторы C обращались к нулевому адресу памяти.
Об этом свидетельствует следующий документ BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html ).
Два компилятора различаются деталями того, как они с этим справляются. В более раннем варианте начало находится путем присвоения имени функции; в более поздних версиях начало просто принимается равным 0. Это указывает на то, что первый компилятор был написан до того, как у нас была машина с отображением памяти, поэтому источник программы не находился в местоположении 0, тогда как ко времени второго компилятора у нас был PDP-11, который обеспечивал отображение.
(Фактически, на сегодняшний день (как я цитировал выше ссылки из Википедии и Microsoft Press), причина ограничения доступа к нулевому адресу связана с указателями NULL в C! Так что в конце оказывается, что все наоборот!)
3) Помните, что C также используется для написания операционных систем и даже компиляторов C!
Фактически C был разработан с целью написания с ним операционной системы UNIX, и, как таковой, кажется, нет причин, по которым они должны ограничивать себя от нулевого адреса.
(Аппаратное обеспечение) Объяснение того, как компьютеры (физически) могут получить доступ к нулевому адресу
Есть еще один момент, который я хочу здесь объяснить: как вообще можно ссылаться на нулевой адрес?
Подумайте об этом на секунду, адреса выбираются процессором, а затем отправляются как напряжения на шине памяти, которые затем используются системой памяти для получения фактического адреса, и все же нулевой адрес будет означать отсутствие напряжения. Итак, как физическое оборудование системы памяти обращается к нулевому адресу?
Ответ выглядит так: нулевой адрес является значением по умолчанию, и, другими словами, нулевой адрес всегда доступен системе памяти, когда шина памяти полностью отключена, и, как таковой, любой запрос на чтение или запись без указания фактического адреса (который в случае с нулевым адресом) автоматически обращается к нулевому адресу.
if (p != 0)
наif (p)
который является общим идиома в C и C ++, хотя вам придется выйти из привычки , если вы берете на Java.