Нулевые указатели
Часть раздела Логика и управление потоком путешествия по C++ на Coddy. Урок 4 из 56.
Когда вы объявляете указатель, он не начинает сам по себе указывать на что-то осмысленное. Неинициализированный указатель содержит случайный адрес памяти, и попытка его использовать может привести к серьёзным ошибкам. Здесь и нужны нулевые указатели: без них не обойтись в безопасном программировании.
Нулевой указатель — это указатель, который явно ни на что не указывает. В современном C++ нулевой указатель создают, инициализируя его значением nullptr:
int* ptr = nullptr; // теперь ptr — нулевой указательКлючевое слово nullptr означает, что указатель не указывает ни на какую допустимую область памяти. Это гораздо безопаснее, чем оставлять указатель неинициализированным, ведь перед разыменованием можно проверить, не нулевой ли он.
Прежде чем использовать указатель, убедитесь с помощью простого оператора if, что он не нулевой:
if (ptr != nullptr) {
// здесь *ptr можно безопасно использовать
int value = *ptr;
}Эта привычка защищает программу от сбоев из-за обращения к недопустимым адресам памяти. Всегда инициализируйте указатели значением nullptr при объявлении и проверяйте, не нулевые ли они, перед разыменованием.
Задание
ЛегкоСоздайте программу, которая показывает безопасную работу с указателями: перед разыменованием она проверяет, не нулевой ли указатель.
На вход будет подано:
- Строка: либо
"valid", либо"null"
Ваша программа должна:
- Объявить целочисленную переменную с именем
dataи инициализировать её значением42 - Объявить указатель с именем
ptr - Если на входе
"valid", присвоитьptrадресdata - Если на входе
"null", присвоитьptrзначениеnullptr - С помощью оператора if проверить, что
ptrне нулевой, прежде чем его использовать - Если указатель не нулевой, вывести значение, на которое он указывает
- Если указатель нулевой, вывести предупреждающее сообщение
Используйте точно такой формат вывода:
Value: [value]Для нулевого указателя используйте такой формат:
Pointer is null - cannot dereferenceПопробуйте сами
#include <iostream>
#include <string>
using namespace std;
int main() {
// Считать ввод
string input;
cin >> input;
// Объявить переменную data
int data = 42;
// TODO: Напишите свой код здесь
// - Объявить указатель с именем ptr
// - Проверить ввод и присвоить подходящее значение ptr
// - Использовать if-statement для безопасной проверки и использования указателя
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаровПотренируйтесь самостоятельно: Онлайн-компилятор C++