小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
当static_cast
转换不被编译器允许时,在你真的确保转换是可以安全转换时,你可以使用reinterpret_cast
,用法和static_cast
一样。
基础示例
#include <iostream> // std::cout std::endl
class int_type
{
public:
int value;
};
int main(void)
{
int_type t;
t.value = 233;
int *p = reinterpret_cast<int *>(&t);
*p = 666;
std::cout << t.value << std::endl;
return 0;
}
输出结果:
666
上面代码中将int_type
类型的对象t
的地址强制从int_type *
转换成int *
。
类int_type
只有一个成员变量并且是int
类型的,占用的大小就是int
的大小。所以使用int
的指针操作int_type
的地址是没有问题的,不会操作到无关的内存。如果使用static_cast
,编译器检测这两个类型不是同一种类型,所以会报错。
注意:如果上面使用long long *p
来操作int_type
,由于long long
会操作8个字节的内存,而int_type
只有4字节,这样将会导致内存中的数据错误。所以使用reinterpret_cast
的时候要非常小心。