单指针指向两个不同的结构表

时间:2014-07-08 12:05:21

标签: c++ pointers struct

我已经阅读了下面的文章,但我仍然有同样的问题......

如果我在运行时向一个或其他结构投射了一个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

1 个答案:

答案 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; 
 }

然后没有问题。