Является ли NULL указателем? - PullRequest
5 голосов
/ 04 апреля 2019

Итак, у меня был спор с моим профессором, ранее защищавшим, что NULL не является указателем, но он продолжал настаивать, что это потому, что существует такая вещь, как указатель NULL. Итак, теперь я немного запутался, если NULL действительно указатель или нет

Я уже пробовал поиск по Интернету, но не смог найти ответа, поэтому мое последнее средство здесь

Ответы [ 3 ]

4 голосов
/ 04 апреля 2019

В C NULL - это макрос, который расширяется до константы нулевого указателя.

7.19p3

Макросы

NULL, который расширяется до определенной в реализации постоянной нулевого указателя;...

Константа нулевого указателя является выражением целочисленной константы со значением 0 (например, 0, 1-1, 42*0LL и т. Д.) Или таким приведенным выражениемна (void*).

6.3.2.3p3

Целочисленное константное выражение со значением 0 или такое выражение, приведенное к типу void *, имеет видназывается константой нулевого указателя.66) Если константа нулевого указателя преобразуется в тип указателя, результирующий указатель, называемый нулевым указателем, гарантированно сравнивается с неравным указателем на любой объект или функцию.

Наиболее распространенные реализации C определяют NULL как 0, 0L или ((void*)0).

Таким образом, вы правы.NULL не обязательно должен быть указателем.

(IIRC, C ++ даже не разрешает приведение (void*) в NULL, что означает, что NULL в C ++ всегда имеет целочисленный тип.void* указатели не сравниваются с обычными указателями, поэтому в C ++ C ++> = 11 теперь имеет специальное ключевое слово nullptr.)

3 голосов
/ 07 апреля 2019

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.

0 голосов
/ 07 апреля 2019

Нет ничего плохого в идее «указатель на адрес 0».

Правило таково, что вы не можете разыменовывать его ... оно разрешено существовать, и если оно создано, оно будет соответствоватьлюбые критерии "указательности" я могу придумать.Просто потому, что это не имеет смысла указатель на что-то ...

...