Урок 81. Нулевые указатели

   ⁄ 

 Обновлено 18 Сен 2017

  ⁄   

Как и в случае с обычными переменными, указатели не инициализируются при создании. Если значение не было присвоено, то указатель по умолчанию будет указывать на любой адрес с мусором.

Нулевые значения и нулевые указатели

Помимо адресов памяти, есть еще одно значение, которое указатель может хранить: значение null. Нулевое значение (значение null) — это специальное значение, которое означает, что указатель ни на что не указывает. Указатель, содержащий значение null, называется нулевым указателем.

В C++ мы можем присвоить указателю нулевое значение, инициализируя его или присваивая ему литерал 0:

Поскольку значением нулевого указателя является нуль, то это можно использовать внутри условного ветвления для проверки того, является ли указатель нулевым или нет:

Совет: Инициализируйте указатели нулевым значением, если не собираетесь присваивать им другие значения.

Разыменование нулевых указателей

В предыдущем уроке мы узнали, что разыменование указателей с мусором приведет к неожиданным результатам. С разыменованием нулевого указателя дела обстоят так же. В большинстве случаев вы получите сбой.

В этом есть смысл. Ведь разыменование указателя означает, что нужно «перейти к адресу, на который указывает указатель, и достать из этого адреса значение». Нулевой указатель не имеет адреса. Поэтому и такой результат.

Макрос NULL

В языке C (но не C++) определен специальный макрос препроцессора с именем NULL, который #defined как значение 0. Хотя он и не является частью C++, его использование достаточно распространено, и должно работать в каждом компиляторе C++:

Однако, поскольку NULL является макросом препроцессора и, технически, не является частью C++, то лучшей практикой в C++ считается избегать его использования.

nullptr в C++11

Обратите внимание, значение 0 не является типом указателя, и присваивание указателю 0 для обозначения того, что он является нулевым — немного противоречиво, не так ли? В редких случаях, использование 0 как аргумента-литерала может привести к проблемам, так как компилятор не сможет определить, используется ли нулевой указатель или целое число 0:

Для решения этой проблемы, в C++11 ввели новое ключевое слово — nullptr. nullptr — это и ключевое слово, и константа r-value.

Начиная с C++11, при работе с нулевыми указателями, использование nullptr является более предпочтительным вариантом, нежели использование 0:

C++ неявно преобразует nullptr в соответствующий тип указателя. Таким образом, в примере выше, nullptr неявно преобразуется в указатель типа int, а затем значение nullptr (0) присвоится ptr.

nullptr также может использоваться для вызова функции, в качестве аргумента-литерала:

Совет: В C++11 используйте nullptr для инициализации нулевых указателей.

std::nullptr_t в C++11

В C++11 добавили новый тип — std::nullptr_t (находится в заголовочном файле <cstddef>). std::nullptr_t может иметь только одно значение: nullptr! Хотя это может показаться немного глупым, но это полезно в одной ситуации. Если вы хотите написать функцию, которая принимает аргумент nullptr, то параметр какого типа нужно сделать? Правильно! std::nullptr_t.

Вам, вероятно, никогда это и не придется использовать, но знать об этом стоит, на всякий пожарный 🙂

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (5 оценок, среднее: 4,40 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *