NULL
сам по себе не указатель, это макрос, который можно использовать для инициализации указателя на значение нулевой указатель его типа. При сравнении с указателем он сравнивается равным, если указатель является нулевым указателем , и неравным, если указатель является допустимым указателем на объект его типа.
Не существует семантической разницы между char *p = 0;
и char *p = NULL;
, но последний является более явным и использование NULL
вместо 0
более информативно в обстоятельствах, когда другой операнд не является явно указателем или по сравнению с целое число выглядит как несоответствие типов:
FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
/* report the error */
}
Аналогично, нет семантической разницы в C между '\0'
и 0
, они оба являются int
константами. Первый - нулевой байт, второй - нулевое значение. Использование 0
, '\0'
и NULL
может показаться бесполезным, но делает код более читабельным для других программистов и для себя самого.
Путаница может возникнуть из-за неправильного написания или неправильного восприятия нулевого указателя как указателя NULL
. Стандарт C был тщательно проверен, чтобы использовать только нулевой указатель и ссылаться на NULL
только как макрос NULL
.
Обратите внимание, что одно из принятых определений NULL
, #define NULL ((void*)0)
дает NULL
нулевой указатель до void
.