【问题标题】:Pointer to integer using reinterpret使用重新解释指向整数的指针
【发布时间】:2011-12-10 19:26:55
【问题描述】:

我正在尝试使用 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* 指针?如果我是对的?

【问题讨论】:

  • 对于第二部分,这意味着任何指针(IE MyClassA*int *)都可以转换为整数类型,例如 long,因为您的机器上的 sizeof(long) >= sizeof(MyClassA *). So on a machine using 8 byte pointers and 8 byte longs you could say: int * X;长 y = (long)x;`
  • @PaulPRO:我明白了,知道为什么我要转换一个指向整数的指针吗?它也会是不可移植的吗?
  • @user1086635:与将指针转换为另一个指针的原因相同。在做本质上不可移植的事情时。使用 reinterpret_cast 使代码突出,因此当有人阅读它时,请注意并仔细阅读。

标签: c++ reinterpret-cast


【解决方案1】:

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

这意味着int*int。指针不是整数类型。

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

继承会起作用。让类型继承自基类!

【讨论】:

    【解决方案2】:

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

    但是,标准并不能保证这会起作用(所以不要这样做),MyClassA 和 MyClassB 是两个独立的类型,即使它们在结构上相同也是不兼容的。

    同样适用于 int*。

    如果您需要在 then 之间进行转换,则可以进行 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();
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我对第一个的回答是肯定的。指针只是一个变量(整数),其值是指向另一个内存位置的地址。这就是您能够执行以下操作的原因。

        (*(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 的地址。

        【讨论】:

          猜你喜欢
          • 2018-01-03
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多