我一直在尝试使用指针并编写以下代码:
#include <iostream>
using std::cout;
struct A
{
int a;
char b;
A(){ a = 4; }
};
struct B
{
int c;
B(){ c = 5; }
};
A *a = new A;
B *b = new B;
int main()
{
a = (A*)b;
cout << a -> a; //5
}
为什么B*
可以转换为A*
?可以将任何指针转换为任何其他指针吗?
答案 0 :(得分:1)
&#34;是否可以将任何指针转换为任何其他指针?&#34;
如果你使用这样的c风格演员,是的。
a = (A*)b;
b
指向的结构将被(重新)解释,就像A
一样。正确的c ++等价物是
a = reinterpret_cast<A*>(b);
通过一致性,您从这些演员阵容中获得的经验不太可能符合预期。
换句话说:您将经历各种未定义的行为,在进行此类演员后访问a
的任何成员。
你应该使用static_cast<>
让编译器检查,如果这些类型是相关的,并且可以合理地以某种方式
a = static_cast<A*>(b);
检查这些在线示例,了解static_cast<>
和reinterpret_cast<>
的差异。