РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
732 of 815 menu

Оператор reinterpret_cast

Оператор reinterpret_cast выполняет самое низкоуровневое из всех преобразований типов в C++. Он не изменяет значение данных, а лишь заставляет компилятор рассматривать ту же самую область памяти как объект другого типа. В первый параметр мы передаем тип, к которому нужно привести значение, а во второй - само значение или указатель. Этот оператор применяется для преобразования указателей в целые числа и обратно, а также для приведения между указателями на несвязанные типы.

Оператор reinterpret_cast не может снимать константность (для этого есть const_cast) и не выполняет проверок во время выполнения программы (в отличие от dynamic_cast). Его поведение во многом зависит от реализации компилятора, поэтому использовать его следует только тогда, когда вы точно понимаете, что делаете.

Синтаксис

reinterpret_cast<new_type>(expression)

Пример

Давайте преобразуем указатель на целое число в указатель на символ и посмотрим, как изменится интерпретация памяти:

#include <iostream> using namespace std; int main() { int num = 65; int* pNum = # char* pChar = reinterpret_cast<char*>(pNum); cout << *pChar << endl; return 0; }

Результат выполнения кода:

"A"

Пример

Давайте преобразуем указатель в целое число типа uintptr_t, чтобы получить адрес памяти в числовом виде:

#include <iostream> #include <cstdint> using namespace std; int main() { int num = 12345; int* pNum = # uintptr_t addr = reinterpret_cast<uintptr_t>(pNum); cout << addr << endl; return 0; }

Результат выполнения кода (значение адреса может отличаться при каждом запуске):

140701234567890

Пример

Давайте выполним обратное преобразование - из целого числа обратно в указатель:

#include <iostream> #include <cstdint> using namespace std; int main() { int num = 12345; int* pNum = # uintptr_t addr = reinterpret_cast<uintptr_t>(pNum); int* pRestored = reinterpret_cast<int*>(addr); cout << *pRestored << endl; return 0; }

Результат выполнения кода:

12345

Смотрите также

  • оператор static_cast,
    который выполняет преобразование на этапе компиляции
  • оператор dynamic_cast,
    который выполняет безопасное преобразование полиморфных типов
  • оператор const_cast,
    который снимает или добавляет константность
  • оператор C-style cast,
    который выполняет преобразование в стиле языка C
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить