• Index

reinterpret_cast

Reads: 7

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的时候要非常小心。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.