鉴于以下条件:
struct A
{
int a;
};
struct B
{
int b;
};
int main()
{
A a {1};
A* p = &a;
Run Code Online (Sandbox Code Playgroud)
使用static_cast和使用reinterpret_castvia 进行铸造void*会产生相同的结果吗?即以下表达式之间有什么区别吗?
static_cast <A*> ( static_cast <void*> (p) );
reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
Run Code Online (Sandbox Code Playgroud)
如果我们投指针到一个类的指针到其他课程,static_cast并与reinterpret_cast?这两个运营商之间有什么区别吗?下列表达式是否相同?
static_cast <B*> ( static_cast <void*> (p) );
reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
reinterpret_cast <B*> ( p );
Run Code Online (Sandbox Code Playgroud)
我可以B*在此之后使用指针来访问b成员吗?
很长一段时间我都是reinterpret_cast这样使用的:
static_assert(sizeof(int) == sizeof(float));
int a = 1;
float b = *reinterpret_cast<float*>(&a); // viewed as float in binary.
Run Code Online (Sandbox Code Playgroud)
然而,当我最近回顾C++中的类型转换时,我发现当考虑严格的别名规则时,它是UB!可以优化对初始数据的不同类型(或者确切地说,非相似类型)的指针的引用。(我知道std::bit_cast在 C++20 中这是另一种方法。)
从我的角度来看,reinterpret_cast主要是用于指针类型转换。然而,考虑到禁止取消引用,我如何使用另一种类型的指针?
我浏览了何时使用reinterpret_cast,下面引用了一个答案:
需要reinterpret_cast 的一种情况是与不透明数据类型交互时。这种情况经常发生在程序员无法控制的供应商 API 中。下面是一个人为的示例,其中供应商提供了用于存储和检索任意全局数据的 API。
但是当涉及到这些API的实现时,如果要在那里使用数据,就很难避免取消对指针的引用。
看起来只有转换为另一种指针类型并返回初始指针类型才是合理的(但这有什么意义?为什么不使用初始类型或直接定义模板?)。所以我的问题是:什么时候使用reinterpret_cast而不违反该规则?有没有通用的用法?
我真的是 C++ 的新手,所以任何建议将不胜感激。
我已经在代码中创建了一些指针,但是结果却不是我期望的。
这是简单的代码:
int main(int argc, char const* argv[])
{
int myInt = 23;
int* ptr = &myInt;
char* buffer = new char[8];
memset(buffer, 0, 8);
char** ptr2 = &buffer;
std::cout << "ptr address is " << ptr << std::endl;
std::cout << "buffer pointer is pointing to address " << buffer << std::endl;
std::cout << "ptr2 pointer is pointing to address " << ptr2 << std::endl;
std::cout << "Dereferencing ptr2 = " << *ptr2 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是运行代码的结果:
ptr地址是0x7ffde215a14c …
我想在重新解释的类中从父函数调用子函数,如下所示。
例子
#include <iostream>
class A {
public:
void func1() {
// some code
func2();
// some code
}
protected:
virtual void func2() {
printf("class A\n");
}
};
class B : public A {
protected:
virtual void func2() {
printf("class B\n");
}
};
int main() {
A* ab = new A();
ab->func1(); // this print "class A"
B* bab = reinterpret_cast<B*>(ab);
bab->func1(); // this also print "class A"
// I want to print "class B" when I use bab->func1()
} …Run Code Online (Sandbox Code Playgroud) 我有一个库的返回值,它是一个void指针.我知道它指的是一个简短的int; 我尝试以下列方式获取int值(用简单的赋值替换函数调用a void *):
short n = 1;
void* s = &n;
int k = *(int*)s;
Run Code Online (Sandbox Code Playgroud)
我尝试转换一个指向一个地址的空指针,其中有一个短的,我试图将指针转换为指向一个int,当我这样做时,输出变成一个垃圾值.虽然我理解为什么它表现得像我不知道是否有解决方案.