假设uint32_t x
的值是一个地址。我如何获得该地址背后的价值?
我的尝试是简单地将地址分配给指针。
int*y = x;
但是x不是int指针,它只是一个以地址作为值的int。
答案 0 :(得分:2)
可以使用reinterpret_cast
或显式转换将足够大的整数类型表示为所有数据指针。可以使用间接运算符将指针间接获得指针值。
请注意,uint32_t
不能保证足够大以能够表示所有指针值(实际上在现代64位cpus上还不够)。 uintptr_t
就是为了这个目的。
请注意,如果指向的地址不包含(兼容类型的)对象,则行为将是不确定的。
答案 1 :(得分:2)
在C ++中,可以使用reinterpret_cast
8.5.1.10重新解释演员表[expr.reinterpret.cast]
...
5.整数类型或枚举类型的值可以显式转换为指针。指针将转换为足够大的整数(如果实现中存在这样的大小)并返回相同的指针类型,则指针将具有其原始值;指针和整数之间的映射否则由实现定义。 [注:除非有6.6.4.4.3所述,否则这种转换的结果将不是安全得出的指针值。 —尾注]
并且6.6.4.4.3中的规则规定:
仅当整数类型的类型至少与
std::intptr_t
一样大且为以下值之一时,整数值才是安全派生指针的整数表示形式:
—(3.1)对安全得出的指针值进行reinterpret_cast的结果;
—(3.2)对安全派生的指针值的整数表示形式进行有效转换的结果;
—(3.3)从可追溯的指针对象复制了其值的对象的值,其中在复制时,源对象包含安全派生的指针值的整数表示;
—(3.4)加法运算或按位运算的结果,如果操作数之一是安全派生的指针值P的整数表示,则由reinterpret_cast<void*>
转换的结果将等于安全派生的指针可计算来自reinterpret_cast<void*>(P)
。
因此,如果x
(在问题中)的类型至少与std::intptr_t
一样大,并且已经按照上述规则已经是安全派生指针的整数表示,则您将能够获取存储在x
中的地址后面的值。