Evg |
СОДЕРЖАНИЕ
Что такое NULL
Запись от Evg размещена 15.02.2012 в 12:46
Показов 20894
Комментарии 0
|
ВНИМАНИЕ! Вопросы по существу обсуждаемого вопроса просьба задавать здесь или создать тему на форуме и кинуть на неё ссылку в блог или мне в личку.
Объясняю почему
Причин для этого несколько. Я, как и любой другой автор, всегда могу упустить интересный момент обсуждаемой темы (что подтвердилось на практике). А потому задаваемый вопрос может закрывать пробел в статье. Ответ на конкретный вопрос, как правило, дать несложно. Сложнее его аккуратно сформулировать так, чтобы ответ являлся законченной частью статьи. Поэтому, как правило, на первых порах я ограничиваюсь конкретным ответом на конкретный вопрос, а в статью временно вставляю ссылку на пост, где был дан ответ. А когда дойдут руки, то вместо ссылки пишу нормальное пояснение. Технические возможности блога не позволяют в комментариях пользоваться широкими возможностями, доступными на форуме (то как выделение текста жирным, вставка фрагментов исходников в удобном для чтения виде и т.п.), поэтому будет удобнее, если вопрос и ответ будут опубликованы на форуме Любая статья является изложением знаний в общем случае. У многих людей мышление устроено так, что прочтя на форуме конкретный вопрос и конкретный ответ на этот вопрос, у них появится бОльшее понимание, чем после прочтения теоретических выкладок (даже если они подкреплены конкретными примерами). Ссылки на такие обсуждения я, как правило, включаю в последний раздел статьи. Начинающие, как правило, поиск ответов на свои вопросы ведут именно в форуме, а не в блогах. А потому конкретный вопрос и конкретный ответ для них будет более удобным и полезным именно на форуме. Многие люди умеют работать методом тыка, лишь бы был конкретный пример в качестве образца. А потому такое обсуждение будет им полезным даже без прочтения статьи Исторически сложилось, что раньше (когда ещё не было блога) статьи располагались на форуме и представлены были в виде двух тем. Первая тема создавалась в специально отведённой свалке и представляла собой черновик, который со временем дорабатывался до законченной статьи. После этого статья переезжала во вторую тему в тематическом разделе. А первая тема оставалась дополнительной свалкой для замечаний и мелких вопросов по теме. Ссылку на старое местоположение данной свалки я помещаю в начале статьи. Вопросы, по возможности, прошу создавать в отдельных темах, но если вопрос действительно мелкий, то можно его задать и в указанной свалке. ВНИМАНИЕ! Как выяснилось, это не так. Описанное поведение в общем-то имеет место быть, но это НЕ стандартное поведение (т.е. противоречит стандарту языка Си). Статью на всякий случай не удаляю, пусть будет лишним напоминанием на тему того, что можно быть на 100% в чём-то уверенным, но при этом ошибаться 1. Общие сведения Во многих учебниках написано, что NULL - это такой указатель со значеним ноль. По факту на "обычных" архитектурах это так и есть, но определение NULL'а несколько другое. В адресном пространстве должен быть выделен некий адрес, который не может являться адресом ни одной переменной и ни одной функции. И именно этот адрес является NULL'ом. Как уже отмечалось, на "обычных" процессорах значение NULL равно нулю, но на сигнальных процессорах, где мало памяти, нулевой адрес является вполне законным. Поэтому в качестве NULL может быть выбрано значение, например, -1. Следует так же отметить, что понятие NULL - это некое программное соглашение, которое введено в систему программирования (а не в аппаратуру) и которое используется при взаимодействии кодов, написанных на языке и ассемблере. Или при взаимодействии пользовательской программы и операционной системы. Таким образом значение указателя NULL является архитектурно-зависимым. Именно поэтому его и в ввели в стандарт языка Си - чтобы можно было писать переносимый код. При этом описание NULL'а делается в заголовочном файле (include) stdio.h Если вернуться к тем же самым сигнальным процессорам, на которых мало памяти, то как правило их программируют "ручками" на ассемблере. Но тем не менее под многие сигнальные процессоры существуют компиляторы с языка Си. Полноценных программ на Си не пишут, но пишут программные прокладки, которые вызывают ассемблерные коды. Ну и, поскольку компилятор всё-таки есть, стандарт языка есть, то приходится в том числе поддерживать и корректную работу с NULL. 2. Тонкие моменты Хочется описать некоторые тонкие моменты. Использование rvalue (выражения, допустимого в правой части присваивания) в операциях сравнения эквивалентно сравнению с нулём. Т.е.
FIXME Особенности NULL на Си++ (с точки зрения перегрузки функций) FIXME С Си++ не так всё просто: https://www.cyberforum.ru/faq/... ost1489139 FIXME явное присванивание "ptr = int" для значений, совпадающих со значением NULL 3. Ссылки на темы, где обсуждался данный вопрос | ||||||||||||||||||||||||||||||||||||||||
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


