Elementor Header #8

27. Значение null

1. Введение

В программировании значение null используется для обозначения отсутствия значения или ссылки на объект. В C++ это значение часто ассоциируется с указателями, которые могут указывать на память, но иногда могут не указывать ни на что конкретное.

2. Что такое null?

В C++ значение null используется для обозначения «нулевого указателя» — указателя, который не ссылается ни на какой объект или участок памяти. Это состояние указывает на то, что указатель «пуст» и не может быть использован для доступа к данным.

3. Использование null в C++

Для работы с нулевыми указателями в C++ используются следующие ключевые слова и макросы:

  • nullptr (начиная с C++11) — стандартное значение для нулевого указателя.
  • NULL — макрос, который также обозначает нулевой указатель (использовался до введения nullptr).

4. nullptr vs NULL

До C++11 значение нулевого указателя обычно обозначалось макросом NULL, который обычно определялся как 0. Однако использование NULL может привести к неоднозначностям, особенно при перегрузке функций.

nullptr, введённый в C++11, решает эту проблему. Это явное значение нулевого указателя, которое не может быть перепутано с целым числом 0.

Пример:

				
					int* ptr1 = nullptr;  // указатель, который не указывает ни на что
int* ptr2 = NULL;     // эквивалентно, но рекомендуется использовать nullptr

				
			

5. Проверка на null

Когда вы работаете с указателями, часто возникает необходимость проверить, указывает ли указатель на какой-либо объект. Проверка на null позволяет убедиться, что указатель корректен перед его использованием.

Пример:

				
					int* ptr = nullptr;

if (ptr == nullptr) {
    std::cout << "Указатель не указывает ни на что." << std::endl;
} else {
    std::cout << "Указатель указывает на значение: " << *ptr << std::endl;
}

				
			

6. Примеры использования null

1. Инициализация указателей

Когда вы создаёте указатель, его следует инициализировать значением nullptr, если на момент создания он не должен указывать на какой-либо объект.

				
					int* ptr = nullptr;

				
			

2. Проверка успешности выделения памяти

При динамическом выделении памяти с помощью new важно проверять, удалось ли выделить память. В случае неудачи оператор new может вернуть nullptr.

				
					int* array = new(std::nothrow) int[10];

if (array == nullptr) {
    std::cout << "Ошибка: не удалось выделить память." << std::endl;
} else {
    // Используем выделенную память
}

				
			

3. Функции, возвращающие указатели

Если функция должна вернуть указатель, но нет значения, которое она могла бы вернуть, часто возвращается nullptr.

				
					int* findValue(int* array, int size, int value) {
    for (int i = 0; i < size; ++i) {
        if (array[i] == value) {
            return &array[i];
        }
    }
    return nullptr;  // значение не найдено
}

				
			

7. Опасности, связанные с null

Работа с нулевыми указателями требует осторожности. Попытка разыменовать нулевой указатель (то есть получить доступ к значению по адресу nullptr) приведёт к аварийному завершению программы (сегментационной ошибке).

Пример ошибки:

				
					int* ptr = nullptr;
std::cout << *ptr << std::endl;  // Ошибка! Разыменование нулевого указателя

				
			

Заключение

Значение null в C++ используется для обозначения указателей, которые не ссылаются на объекты или участки памяти. Использование nullptr вместо NULL рекомендуется для улучшения читаемости кода и предотвращения ошибок. Важно всегда проверять указатели на null, прежде чем пытаться их использовать, чтобы избежать аварийных ситуаций в программе.

8. Тестовое задание

Напишите программу на C++, которая:

  • Создаёт указатель на целое число и инициализирует его значением nullptr.
  • Проверяет, указывает ли указатель на какой-либо объект.
  • Если указатель указывает на объект, выводит его значение, в противном случае — сообщение о том, что указатель пуст.

Примерный код:

				
					#include <iostream>

int main() {
    int* ptr = nullptr;

    if (ptr == nullptr) {
        std::cout << "Указатель не указывает ни на что." << std::endl;
    } else {
        std::cout << "Указатель указывает на значение: " << *ptr << std::endl;
    }

    return 0;
}

				
			

Запустите программу и убедитесь, что она корректно определяет состояние указателя и выводит соответствующее сообщение.

logo