Форум программистов, компьютерный форум, киберфорум
Evg
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Что такое NULL

Запись от Evg размещена 15.02.2012 в 12:46
Показов 20894 Комментарии 0
Метки c, c++, си

ВНИМАНИЕ! Вопросы по существу обсуждаемого вопроса просьба задавать здесь или создать тему на форуме и кинуть на неё ссылку в блог или мне в личку.
Объясняю почему

Причин для этого несколько.

Я, как и любой другой автор, всегда могу упустить интересный момент обсуждаемой темы (что подтвердилось на практике). А потому задаваемый вопрос может закрывать пробел в статье. Ответ на конкретный вопрос, как правило, дать несложно. Сложнее его аккуратно сформулировать так, чтобы ответ являлся законченной частью статьи. Поэтому, как правило, на первых порах я ограничиваюсь конкретным ответом на конкретный вопрос, а в статью временно вставляю ссылку на пост, где был дан ответ. А когда дойдут руки, то вместо ссылки пишу нормальное пояснение. Технические возможности блога не позволяют в комментариях пользоваться широкими возможностями, доступными на форуме (то как выделение текста жирным, вставка фрагментов исходников в удобном для чтения виде и т.п.), поэтому будет удобнее, если вопрос и ответ будут опубликованы на форуме

Любая статья является изложением знаний в общем случае. У многих людей мышление устроено так, что прочтя на форуме конкретный вопрос и конкретный ответ на этот вопрос, у них появится бОльшее понимание, чем после прочтения теоретических выкладок (даже если они подкреплены конкретными примерами). Ссылки на такие обсуждения я, как правило, включаю в последний раздел статьи.

Начинающие, как правило, поиск ответов на свои вопросы ведут именно в форуме, а не в блогах. А потому конкретный вопрос и конкретный ответ для них будет более удобным и полезным именно на форуме. Многие люди умеют работать методом тыка, лишь бы был конкретный пример в качестве образца. А потому такое обсуждение будет им полезным даже без прочтения статьи

Исторически сложилось, что раньше (когда ещё не было блога) статьи располагались на форуме и представлены были в виде двух тем. Первая тема создавалась в специально отведённой свалке и представляла собой черновик, который со временем дорабатывался до законченной статьи. После этого статья переезжала во вторую тему в тематическом разделе. А первая тема оставалась дополнительной свалкой для замечаний и мелких вопросов по теме. Ссылку на старое местоположение данной свалки я помещаю в начале статьи. Вопросы, по возможности, прошу создавать в отдельных темах, но если вопрос действительно мелкий, то можно его задать и в указанной свалке.





ВНИМАНИЕ! Как выяснилось, это не так. Описанное поведение в общем-то имеет место быть, но это НЕ стандартное поведение (т.е. противоречит стандарту языка Си). Статью на всякий случай не удаляю, пусть будет лишним напоминанием на тему того, что можно быть на 100% в чём-то уверенным, но при этом ошибаться

1. Общие сведения

Во многих учебниках написано, что NULL - это такой указатель со значеним ноль. По факту на "обычных" архитектурах это так и есть, но определение NULL'а несколько другое. В адресном пространстве должен быть выделен некий адрес, который не может являться адресом ни одной переменной и ни одной функции. И именно этот адрес является NULL'ом.

Как уже отмечалось, на "обычных" процессорах значение NULL равно нулю, но на сигнальных процессорах, где мало памяти, нулевой адрес является вполне законным. Поэтому в качестве NULL может быть выбрано значение, например, -1. Следует так же отметить, что понятие NULL - это некое программное соглашение, которое введено в систему программирования (а не в аппаратуру) и которое используется при взаимодействии кодов, написанных на языке и ассемблере. Или при взаимодействии пользовательской программы и операционной системы. Таким образом значение указателя NULL является архитектурно-зависимым. Именно поэтому его и в ввели в стандарт языка Си - чтобы можно было писать переносимый код. При этом описание NULL'а делается в заголовочном файле (include) stdio.h

Если вернуться к тем же самым сигнальным процессорам, на которых мало памяти, то как правило их программируют "ручками" на ассемблере. Но тем не менее под многие сигнальные процессоры существуют компиляторы с языка Си. Полноценных программ на Си не пишут, но пишут программные прокладки, которые вызывают ассемблерные коды. Ну и, поскольку компилятор всё-таки есть, стандарт языка есть, то приходится в том числе поддерживать и корректную работу с NULL.

2. Тонкие моменты

Хочется описать некоторые тонкие моменты. Использование rvalue (выражения, допустимого в правой части присваивания) в операциях сравнения эквивалентно сравнению с нулём. Т.е.

C
1
2
int x;
if (x) ...
эквивалентно

C
1
2
int x;
if (x != 0) ...
При этом "ноль", с которым делается сравнение, должен соответствовать некоторому "нулевому значению конкретного типа". Для числовых типов (целых и плавающих) таким "нулём" является целочисленный и плавающий нули. А вот для указателя "нулём" является значение NULL. Таким образом

C
1
2
int *p;
if (p) ...
эквивалентно

C
1
2
int *p;
if (p != NULL) ...
но не

C
1
2
int *p;
if (p != (int*)0) ...
В случае статической инициализации глобальной переменной имеем такую же ситуацию. Глобальная переменная инициализируется "нулём" соответсвующего типа. И код

C
1
int *p; /* глобальная переменная */
эквивалентен

C
1
int *p = NULL; /* глобальная переменная */
но не

C
1
int *p = (int*)0; /* глобальная переменная */
Понятие NULL, как уже говорилось, описано в заголовночном файле (include) stdio.h. При этом компилятор так же должен знать, в какое значение установлен библиотечный NULL. Чтобы избежать необходимости согласования компилятора и заголовочных файлов, в последних стандартах языка Си++ ввели (или собираются ввести) в язык понятие nullptr (что соотвествует современному значению NULL)

FIXME Особенности NULL на Си++ (с точки зрения перегрузки функций)
FIXME С Си++ не так всё просто: https://www.cyberforum.ru/faq/... ost1489139
FIXME явное присванивание "ptr = int" для значений, совпадающих со значением NULL

3. Ссылки на темы, где обсуждался данный вопрос
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru