Дело в том, что большинство ответов здесь не адресованы, по крайней мере, не явно, в том, что нулевой указатель - это значение, которое существует во время выполнения, а константа нулевого указателя - это синтаксическая конструкция, которая существует в исходном коде C.
Константный указатель NULL , так как ответ Карлсона правильно утверждает, либо выражение постоянного целого числа со значением 0 (простым 0
является наиболее распространенным примером), или такого выражения приведения к void*
(например (void*)0
).
NULL
это макрос, определенный в <stddef.h>
некоторых других стандартных заголовках, который расширяется до определенной в реализации постоянной нулевого указателя . Расширение обычно либо: 0
либо ((void*)0)
(внешние скобки необходимы для соответствия другим языковым правилам).
Таким образом, литерал 0
, когда используется в контексте, который требует выражения типа указателя, всегда оценивается как a null pointer
, то есть уникальное значение указателя, которое указывает на отсутствие объекта. Это не подразумевает ничего о представлении нулевого указателя . Нулевые указатели очень часто представлены как все биты-ноль, но они могут быть представлены как что-либо. Но даже если указатель нулевой представляется в виде 0xDEADBEEF
, 0
или (void*)0
по - прежнему является постоянным указателем нулевой .
Ответ на вопрос о StackOverflow охватывает это хорошо.
Это подразумевает, среди прочего, что memset()
или calloc()
, который может установить область памяти равной нулю, все необязательно будет устанавливать любые указатели в этой области на нулевые указатели. Они, вероятно, делают это в большинстве реализаций, но язык не гарантирует этого.
Я не знаю , почему этот вопрос не считается дубликатом этого одного , или , как это актуально здесь.