( Будь ласка, прочитайте цей параграф перед читанням повідомлення. Я прошу всіх, хто зацікавився читати цю публікацію, спробувати прочитати її уважно, і, звичайно, не зволікайте, поки ви не зрозумієте її повністю, дякую.)
Зараз вікі спільноти, як такий, якщо хтось не погоджується з будь-яким із понять, будь ласка, модифікуйте його з чітким і детальним поясненням того, що не так і чому, і, якщо можливо, наведіть джерела або надайте докази, які можуть бути відтворені.
Відповідь
Ось кілька інших причин, які можуть бути основними факторами для NULL == 0
- Справа в тому, що нуль неправдивий, тому можна робити безпосередньо
if(!my_ptr)
замість цьогоif(my_ptr==NULL)
.
- Той факт, що неініційовані глобальні цілі числа ініціалізуються за замовчуванням на всі нулі, і як такий покажчик усіх нулів вважатиметься неініціалізованим.
Тут я хотів би сказати слово про інші відповіді
Не через синтаксичний цукор
Сказати, що NULL дорівнює нулю через синтаксичний цукор, не має занадто великого сенсу, якщо так, чому б не використовувати індекс 0 масиву, щоб утримати його довжину?
Насправді C - це мова, яка найбільше нагадує внутрішню реалізацію, чи є сенс говорити, що C вибрав нуль саме через синтаксичний цукор? Вони скоріше нададуть ключове слово null (як це роблять багато інших мов), а не відображення нуля в NULL!
Тому що, як сьогодні, це може бути просто синтаксичний цукор, зрозуміло, що початковий задум розробників мови С був не для синтаксичного цукру, як я покажу далі.
1) Специфікація
І хоча це правда, що специфікація C говорить від константи 0 як нульовий покажчик (розділ 6.3.2.3), а також визначає NULL, що визначається реалізацією (розділ 7.19 в специфікації C11 і 7.17 в специфікації C99), Фактом залишається факт, що у книзі "Мова програмування на C", яку написали винахідники C, у розділі 5.4 зазначено наступне:
C гарантує, що нуль ніколи не є дійсною адресою для даних, тому повернене значення нуля може використовуватися для сигналізації про ненормальну подію, в цьому випадку пробілу немає.
Покажчик і цілі числа не є взаємозамінними, нуль - єдиний виняток: постійний нуль може бути призначений покажчику, а вказівник може порівнюватися з постійним нулем. Символічна константа NULL часто використовується замість нуля, як мнемоніка, щоб більш чітко вказати, що це особливе значення для вказівника. NULL визначається в. Ми відтепер будемо використовувати NULL.
Як видно (зі слів "нульова адреса"), принаймні початковий намір авторів С був адресовим нулем, а не постійним нулем. Більше того, з цього уривку випливає, що причина специфікації говорить від постійний нуль, ймовірно, не виключає вираз, який оцінює нулю, а замість того, щоб включити цілий постійний нуль, щоб бути єдиною цілою постійною дозволеною для використання в контексті покажчика без кастингу.
2) Підсумок
Хоча специфікація прямо не говорить про те, що нульову адресу можна розглядати інакше, ніж нульову константу, вона не говорить про те, що ні, і той факт, що при роботі з константою з нульовим покажчиком вона не вимагає, щоб її реалізація була визначена як робить за NULL визначеною постійною, замість того, щоб стверджувати, що вона дорівнює нулю, показує, що може бути різниця між нульовою постійною та нульовою адресою.
(Однак якщо це так, я просто задаюся питанням, чому NULL визначена реалізацією, оскільки в такому випадку NULL також може бути постійним нулем, оскільки компілятор все одно повинен перетворити всі нульові константи у фактичну реалізовану NULL?)
Однак я не бачу цього в реальній дії, і на загальних платформах адреса нуль і постійний нуль трактуються однаково і кидають одне і те ж повідомлення про помилку.
Крім того, факт полягає в тому, що сьогоднішні операційні системи фактично зберігають всю першу сторінку (діапазон від 0x0000 до 0xFFFF), щоб запобігти доступу до нульової адреси через NULL вказівника C (див. Http://en.wikipedia.org/wiki/ Zero_page , а також "Windows Via C / C ++ Джефрі Ріхтер та Крістоф Насарр (опубліковано Microsoft Press)".
Таким чином, я просив би всіх, хто претендує на те, що він насправді бачив, вказувати платформу та компілятор та точний код, який він насправді робив (хоча через розпливче визначення у специфікації [як я показав] будь-який компілятор і платформа вільна робити все, що він хоче).
Однак, мабуть, здається, що автори C цього не мали на увазі, і вони говорили про "нульову адресу", і що "C гарантує, що це ніколи не дійсна адреса", а також "NULL - це просто мнемонічний ", чітко показуючи, що його первісний намір був не для" синтаксичного цукру ".
Не через операційну систему
Також заявляючи, що операційна система забороняє доступ до нульової адреси з кількох причин:
1) Коли було написано С, такого обмеження не було, як це можна побачити на цій вікі-сторінці http://en.wikipedia.org/wiki/Zero_page .
2) Справа в тому, що компілятори C отримали доступ до адреси пам'яті до нуля.
Це, мабуть, факт із наступного документа BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
Два компілятори відрізняються деталями у тому, як вони справляються з цим. У попередній - початок знаходимо, називаючи функцію; пізніше початок просто вважається рівним 0. Це вказує на те, що перший компілятор був написаний ще до того, як у нас була машина з картою пам'яті, тому походження програми було не в розташуванні 0, тоді як до моменту другого, у нас був PDP-11, який надав картування.
(Насправді станом на сьогодні (як я цитував посилання з wikipedia та microsoft press), причина обмеження доступу до нульової адреси - через NULL-покажчики C! Отже, врешті-решт, виявляється навпаки!)
3) Пам'ятайте, що C також використовується для запису операційних систем і навіть компіляторів C!
Насправді C був розроблений для того, щоб записати на нього операційну систему UNIX, і як таке, мабуть, немає причин, чому вони повинні обмежуватися від нульової адреси.
(Обладнання) Пояснення про те, як комп’ютери (фізично) здатні отримати доступ до нульової адреси
Тут я хочу пояснити ще один момент, як взагалі можна посилатись на нуль?
Подумайте про це на секунду, адреси надходить процесором, а потім надсилаються як напруги на шині пам'яті, яка потім використовується системою пам'яті, щоб дістатись до фактичної адреси, і все ж адреса нуля означатиме відсутність напруги , то як фізичне обладнання системи пам'яті отримує доступ до адреси нульовим?
Здається, що відповідь, що нульова адреса є типовим, а іншими словами, адресна нуль завжди доступна системою пам'яті, коли шина пам'яті повністю відключена, і як такий будь-який запит на читання або запис, не вказуючи фактичну адресу (яка у випадку з нульовою адресою) автоматично отримує доступ до нуля адреси.
if (p != 0)
наif (p)
який є загальним ідіома в C і C ++, хоча вам доведеться вийти зі звички , якщо ви берете на Java.