如何别名指针

时间:2011-03-23 23:41:03

标签: c

我有一些类Foo,我想做如下。我有一些指向Foo对象的指针的静态实例static Foo *foo1; static Foo *foo2;

然后,在某些函数中,我希望有一个可以充当它们的通用指针。例如,

Foo *either;
if (some_variable == 1)
{
    either = foo1;
}
else
{
    either = foo2;
}

这就是我期望它的工作方式,但它似乎没有正常运行。通常怎么做?我想要在使用它时实际上是BE foo1或foo2。

2 个答案:

答案 0 :(得分:3)

我猜你在分配foo1和foo2之前分配了。您发布的代码分配给foo1或foo2的当前值,而不是 future 值。为了在foo1或foo2更改后保持正确,它需要是指向它所引用的指针。

static Foo *foo1, *foo2;
Foo **either;
if(some_variable == 1) {
    either = &foo1;
} else {
    either = &foo2;
}

由于其中任何一个现在都是指向对象指针的指针,因此您需要在使用前取消引用它。例如:

if(*either == foo1) printf("either is foo1\n");
    else if(*either == foo2) printf("either is foo2\n");
    else printf("either isn't foo1 or foo2\n");

此代码允许继续指向foo1或foo2更改后的foo1或foo2。

答案 1 :(得分:0)

它对我有用

#include <stdio.h>

typedef struct Foo Foo;
struct Foo {
  int data;
};

void test(Foo *foo1, Foo *foo2, int first) {
  Foo *either;
  if (first == 1)
  {
    either = foo1;
  }
  else
  {
    either = foo2;
  }
  printf("either->data is %d\n", either->data);
}

int main(void) {
  Foo bar, baz;
  bar.data = 42;
  baz.data = 2011;
  test(&bar, &baz, 0);
  test(&bar, &baz, 1);
  return 0;
}

也可在codepad处找到。