Нулевой указатель в C ++ - PullRequest
       0

Нулевой указатель в C ++

2 голосов
/ 25 сентября 2011

Когда в C ++ я объявляю нулевой указатель равным int* p=0, означает ли это, что ноль - это некоторая специальная константа целочисленного типа указателя, или это означает, что p указывает на адрес 0x0? Конечно, для этого 0x0 должен быть специальный адрес, к которому C ++ никогда не прикасается при распределении переменных / массивов.

Ответы [ 8 ]

9 голосов
/ 25 сентября 2011

Стандарт C ++ определяет, что целочисленная константа 0 преобразуется в нулевой указатель. Это не означает, что нулевые указатели указывают на адрес 0x0 . Это просто означает, что текст «0» превращается в нулевой указатель при преобразовании в указатель.

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

Обратите внимание, что использование этого нулевого преобразования считается плохим стилем. Используйте NULL (это макрос препроцессора, определенный как 0, 0L или некоторая другая нулевая целочисленная константа), или, если ваш компилятор достаточно новый, чтобы поддерживать его, nullptr.

3 голосов
/ 25 сентября 2011

Это означает, что целочисленное константное выражение со значением ноль имеет особое значение в C ++; она называется константой нулевого указателя . когда вы используете такое выражение для инициализации указателя или для присваивания указателю, реализация гарантирует, что указатель содержит значение нулевого указателя надлежащим образом . Это гарантированно будет отличаться от любого указателя, указывающего на подлинный объект. Может иметь или не иметь представление "ноль".

ИСО / МЭК 14882: 2011 4.10 [conv.ptr] / 1:

A константа нулевого указателя - это целочисленное константное выражение (5.19) prvalue целочисленного типа с нулевым значением или prvalue типа std::nullptr_t. Константа нулевого указателя может быть преобразована в тип указателя; результатом является значение нулевого указателя этого типа, которое отличается от любого другого значения указателя объекта или типа указателя на функцию.

2 голосов
/ 25 сентября 2011

Это специальное значение, которое по стандарту гарантированно никогда не будет равно указателю, указывающему на объект или функцию. Оператор address-of & никогда не выдаст нулевого указателя, равно как и не приведет к успешному выделению динамической памяти. Вы не должны думать о нем как об адресе 0, а как о специальном значении, которое указывает, что указатель указывает в никуда. Для этой цели существует макрос NULL, а новая идиома - nullptr.

1 голос
/ 25 сентября 2011

Значение указателя равно 0. Это не обязательно означает, что он указывает на адрес 0x0.Макрос NULL, это просто константа 0.

1 голос
/ 25 сентября 2011

Это означает, что он ни на что не указывает.

0 голосов
/ 25 сентября 2011

В вашем примере 'p' является адресом int.Устанавливая p в 0, вы говорите, что есть int по адресу 0. Соглашение заключается в том, что 0 - это «не действительный адрес», а просто соглашение.

На практике адрес 0 обычно «не сопоставлен» (то есть нет памяти, поддерживающей этот адрес), поэтому вы получите ошибку по этому адресу.Однако в некоторых встроенных системах это не так.

Вы также можете выбрать любой случайный адрес (например, 0xffff7777 или любое другое значение) в качестве «нулевого» адреса, но вы будете нарушать соглашение и много путатьлюдей, которые читают ваш код.Ноль обычно используется, потому что большинство языков поддерживают тестирование «ноль - не ноль».

См. Этот связанный вопрос: Почему нулевой адрес используется для нулевого указателя?

0 голосов
/ 25 сентября 2011

Да.Ноль - это особая константа.Фактически, это единственная целочисленная константа, которую можно использовать без явного приведения в таких выражениях:

int *pi = 0;  //ok
char *pc = 0; //ok
void *pv = 0; //ok
A *pa = 0;    //ok

Все будет хорошо скомпилировано.

Однако, если вы используете это вместо этого:

int *pi = 1;  //error
char *pc = 2; //error
void *pv = 3; //error
A *pa = 4;    //error

Все приведет к ошибке компиляции.

В C ++ 11 вы должны использовать nullptr вместо 0, когда вы имеете в виду нулевой указатель.

0 голосов
/ 25 сентября 2011

указатель указывает на адрес 0. На большинстве платформ это очень особенное, но вы должны использовать NULL, потому что это не всегда 0 (но очень часто).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...