Ответ 1
Обновить: это объяснение кажется фиктивным в свете редактирования. Но вам все равно может показаться интересным.
В C-подобных языках значение указателя, записанное как 0
в исходном коде, является просто соглашением для указания нулевого указателя. Нулевой указатель - это указатель, который не должен указывать на какой-либо объект, и он определяется как равный нулю, но ему не нужно иметь такое же внутреннее представление, как и целое число. Нулевые указатели могут иметь множество представлений в зависимости от архитектуры или даже от типа указателя.
Использование 0
означает "нулевой указатель", возможно, является неудачным соглашением; уровень замешательства, который он вызывает, возможно, лучше всего указывается в тексте
hexa comment, я думаю, свидетельствует о трудностях понимания этого соглашения. Беда в том, что есть три идеи, которые нужно разделить:
- Концепция нулевого указателя: указатель, отличный от указателя на любой объект.
- Представление нулевого указателя на машине (в некоторых случаях по адресу 0x00000000, но это не то, на что вы можете или должны полагаться).
- Как вы можете создавать и проверять нулевые указатели на языках C-типа (используя константу нулевого указателя, такую как
0
илиNULL
).
Здесь стандарт С++, раздел 4.10:
Константа нулевого указателя представляет собой интегральное постоянное выражение rvalue целочисленного типа, которое вычисляется до нуля. Константа нулевого указателя может быть преобразована в тип указателя; результатом является нулевое значение указателя этого типа и отличается от любого другого значения указателя на объект или указателя на тип функции. Два значения нулевого указателя одного и того же типа сравниваются равными.
Это гарантирует, что вы можете создать нулевой указатель, используя константу 0
, и проверить, является ли указатель нулевым по сравнению с 0
, но ничего не говорит о машинном представлении нулевого указателя.