使用reinterpret指向整数的指针

Pointer to integer using reinterpret

本文关键字:指针 整数 reinterpret 使用      更新时间:2023-10-16

我试图使用reinterpret_cast将指针转换为另一种类型

class MyClassA
{
 int x;
 int y;
 public:
    MyClassA();
    ~MyClassA();
};
class MyClassB
{
 int x;
 int y;
 public:
    MyClassB();
    ~MyClassB();
};
例如,如果我将指向MyClassA的指针强制转换为指向MyClassB的指针,使用reinterpret_cast,这种转换会工作吗?那么代码可移植性呢?

还有,正如我提到的:

(5.2.10/4)指针可以显式转换为任何整型大到足以容纳它

这是否意味着任何指针,例如MyClassA*只能转换为int*指针?如果我是对的?

(5.2.10/4)指针可以显式地转换为任何足够大的整型。

表示int*int。指针不是整型。

转换不相关类型的指针是个坏消息,不应该这样做。它可以工作,但不能移植。

继承可以工作。从基类继承类型!

至于这是否有效,我不知道,这将取决于实现。

然而,没有标准保证这将工作(所以不要这样做),MyClassA和MyClassB是两个独立的类型,即使它们在结构上相同也是不兼容的。

同样适用于int*.

如果你需要两者之间的转换,你可以做一个A到B的赋值运算符

class MyClassA{
...
    operator=(const MyClassB& mcb)
    {
        this.x=mcb.x;
        this.y=mcb.y;
    }
};

如果你需要访问MyClassA中的整数元素

//in MyClassA
int& getX(){ return x; }
const int& getX() const { return x; }
int& x=mca.getX();

这并不意味着您可以强制转换不相关的类型。这意味着你可以将指针转换为64位整数(例如),如果在你的平台上64位整数足够大,可以包含指针值。

PS:我想提一下,你所做的是完全偏离标准,但你可能会逃脱它在许多平台/编译器:)

我对第一个问题的回答是肯定的。指针只是一个变量(整型),它的值是指向另一个内存位置的地址。这就是为什么你能做以下的事情。

(*(void(*)())0)(); /*Ref: Andrew Koenig C Traps and Pitfals*/

#define CARD_INTERFACE_ADDRESS 0x4801C
struct A * = new (CARD_INTERFACE_ADDRESS) struct A

MyClassA * ptr_a不能(逻辑上)转换为int* ptr_i,因为您所说的是变量ptr_a持有的地址是前者中的MyClassA的地址,而在后者中您说的是说ptr_iint的地址。