NULL
гарантированно равно нулю, возможно, приведено к (void *)
1 .
C99, §6.3.2.3, ¶3
Целочисленное константное выражение со значением 0
, или такое выражение, приведенное к типу void *
, называется константой нулевого указателя. (55) Если константа нулевого указателя преобразуется в тип указателя, результирующий указатель, называемыйнулевой указатель, гарантированно сравнивает неравный указатель с любым объектом или функцией.
И примечание 55 гласит:
55) Макрос NULL определен в <stddef.h>
(и другие заголовки) в качестве константы нулевого указателя.
Обратите внимание, что из-за того, как сформулированы правила для нулевых указателей, значение, которое вы используете для назначения / сравнения нулевых указателей, гарантированно равно нулю., но битовая комбинация, фактически сохраненная в указателе, может быть любой другой вещью (но AFAIK только несколько очень эзотерических платформ воспользовались этим фактом, и это не должно быть проблемой в любом случае, поскольку, чтобы «увидеть» базовую битовую комбинацию, вы должны перейти к UB - в любом случае).
Таким образом, что касается стандарта, две формы эквивалентны (!ptr
эквивалентно ptr==0
в соответствии с §6.5.3.3 ¶5, а ptr==0
эквивалентно ptr==NULL
);if(!ptr)
также довольно идиоматичен.
При этом я обычно пишу явно if(ptr==NULL)
вместо if(!ptr)
, чтобы было совершенно ясно, что я проверяю нулевой указатель вместо некоторого логического значения.
- Обратите внимание, что в C ++ преобразование
void *
не может присутствовать из-за более строгих правил неявного приведения, которые делают использование таких NULL
громоздкими (вам придется явно преобразовывать его в тип сравниваемого указателя каждыйвремя).