我已经阅读了下面的文章,但我仍然有同样的问题......
如果我在运行时向一个或其他结构投射了一个void指针,那么这里的问题似乎是什么?例如,如下面的伪代码
typedef struct A {
int x;
int y;
} A1;
typedef struct B {
int x;
int y;
} B1;
.......
A1 *a1;
B1 *b1;
void *prt;
a1 = new A1;
b1 = new B1;
prt = reinterpret_cast<A1>(a1); // ptr shows to a1 structure ?
prt = reinterpret_cast<B1>(b1); // ptr shows to b1 structure ?
ptr会指向a1和b1结构吗?
[Single Pointer pointing to two different const struct table(look up tables) in c
答案 0 :(得分:2)
这种结构
typedef struct A {
int x;
int y;
} *A1;
定义了一个新的typedef名称。它不是名称为A1的对象的声明。所以编写
会更正确struct A {
int x;
int y;
} *A1;
如果你想让A1成为一个对象。
您也可以将任何类型的指针指定给void指针。所以你可以简单地写一下
prt = A1;
prt = B1;
代替此无效代码
prt = reinterpret_cast<A>(A1);
prt = reinterpret_cast<B>(B1);
这些
没有问题prt = A1;
prt = B1;
分配。
如果要使用一个指针访问两个不同结构的数据成员,则无法执行此操作,因为这两个结构具有不同的类型,并且指针只能有一个类型。
如果你要定义这两种结构的联合,你可以做你想要的。
或者如果您的意思是以下
#include <iostream>
int main ()
{
struct A
{
int x, y;
} a;
struct B
{
int x, y;
} b;
void *p = &a;
reinterpret_cast<A *>( p )->x = 10;
reinterpret_cast<A *>( p )->y = 20;
p = &b;
reinterpret_cast<B *>( p )->x = 30;
reinterpret_cast<B *>( p )->y = 40;
std::cout << "a: " << a.x << '\t' << a.y << std::endl;
std::cout << "b: " << b.x << '\t' << b.y << std::endl;
return 0;
}
然后没有问题。