Оператор 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