Вы должны неправильно понимать значение постоянного нуля в контексте указателя.
Ни в C, ни в C ++ указатели не могут "иметь нулевое значение". Указатели не являются арифметическими объектами. Они не могут иметь числовые значения, такие как «ноль» или «отрицательный» или что-нибудь в этом роде. Так что ваше утверждение о «указателях ... имеют нулевое значение» просто не имеет смысла.
В C & C ++ указатели могут иметь зарезервированное значение нулевого указателя . Фактическое представление значения нулевого указателя не имеет ничего общего с любыми «нулями». Это может быть абсолютно все, что подходит для данной платформы. Это правда, что на большинстве платформ значение нулевого указателя физически представлено фактическим нулевым значением адреса. Однако, если на какой-либо платформе адрес 0 фактически используется для какой-либо цели (то есть вам может потребоваться создать объекты по адресу 0), значение нулевого указателя на такой платформе, скорее всего, будет другим. Например, он может быть физически представлен как 0xFFFFFFFF
адресное значение или 0xBAADBAAD
адресное значение.
Тем не менее, независимо от того, как значение нулевого указателя представлено на данной платформе, в вашем коде вы все равно продолжите обозначать нулевые указатели константой 0
. Чтобы присвоить значение нулевого указателя данному указателю, вы будете продолжать использовать выражения типа p = 0
. Обязанность компилятора - реализовать то, что вам нужно, и перевести его в правильное представление значения нулевого указателя, т.е. преобразовать его в код, который поместит значение адреса 0xFFFFFFFF
в указатель p
, например.
Короче говоря, тот факт, что вы используете 0
в своем коде sorce для генерации значений нулевого указателя, не означает, что значение нулевого указателя каким-то образом связано с адресом 0
. 0
, который вы используете в своем исходном коде, является просто «синтаксическим сахаром», который не имеет абсолютно никакого отношения к фактическому физическому адресу, на который «указывает» значение нулевого указателя.