В C (или С++, если на то пошло) указатели являются особыми, если они имеют значение ноль: мне рекомендуется установить указатели на ноль после освобождения их памяти, потому что это означает, что освобождение указателя снова не является опасным; когда я вызываю malloc, он возвращает указатель со значением 0, если он не может получить мне память; Я использую if (p != 0)
все время, чтобы убедиться, что переданные указатели действительны и т.д.
Но так как адресация памяти начинается с 0, это не 0 как действительный адрес, как любой другой? Как можно использовать 0 для обработки нулевых указателей, если это так? Почему вместо отрицательного числа null?
Edit:
Куча хороших ответов. Я подведу итог тому, что было сказано в ответах, выраженных, как мой собственный разум интерпретирует его, и надеемся, что сообщество исправит меня, если я неправильно пойму.
-
Как и все остальное в программировании, это абстракция. Просто константа, не имеющая отношения к адресу 0. С++ 0x подчеркивает это, добавляя ключевое слово
nullptr
. -
Это даже не абстракция адреса, это константа, заданная стандартом C, и компилятор может перевести ее на какое-то другое число, если она гарантирует, что она никогда не будет равна "реальному" адресу и равна другому нулевому значению указатели, если 0 не является лучшим значением для платформы.
-
Если это не абстракция, которая имела место в первые дни, адрес 0 используется системой и пределы для программиста.
-
Мое предложение отрицательного числа было немного диким мозговым штурмом, признаюсь я. Использование знакового целого числа для адресов немного расточительно, если это означает, что помимо нулевого указателя (-1 или любого другого) пространство значений равномерно распределяется между положительными целыми числами, которые делают действительные адреса и отрицательные числа, которые просто теряются.
-
Если любое число всегда представляется типом данных, оно равно 0. (Вероятно, это тоже. Я думаю о однобитовом целочисленном, которое было бы 0 или 1, если без знака, или просто подписанный бит, если он подписан, или двухразрядное целое число, которое было бы [-2, 1]. Но тогда вы могли бы просто пойти для 0, являющегося нулевым, а 1 - единственным доступным байтом в памяти.)
Все еще есть что-то, что не решено в моем сознании. Вопрос о переполнении Stack переполнении Указатель на определенный фиксированный адрес говорит мне, что даже если 0 для нулевого указателя является абстракцией, другие значения указателя необязательно. Это приводит меня к публикации другого вопроса о переполнении Stack Может ли я когда-либо получить доступ к нулевому адресу?.