0

在下面的代码片段中,可以做些什么来 a) 使编译器安静,以及 b) 清理令人眼花缭乱的指针混乱?

extern struct tree *sintablein[sintablesize];
struct tree *(*tablein)[];
int i;

tablein = &sintablein;     // The compiler complains:
                           // "redundant & applied to array (warning)" and
                           // "illegal conversion between pointer types (warning)"

for(i = 0; i < 10; i++) {
    struct tree *tablemember = (*tablein)[i];   // However, this works like a charm.
    // Do stuff with tablemember
}

我能够做到这一点的唯一方法是使用非常有用的http://cdecl.org/。特别是关于 (b),如何尽可能简化指针和取消引用?

4

2 回答 2

1

让编译器安静的最好方法是听从它的建议。如果编译器抱怨,那么通常是有充分理由的。即使代码有效,它也有可能在将来或在另一个平台上引起问题。

现在,话虽如此,两种使编译器静音的方法是:

  1. 调整警告灵敏度。
  2. 使用强制转换(通常可以通过显式强制转换来解决投诉)。

至于眼睛交叉指针混乱......你必须更具体。如果您正在处理 C,那么您几乎将要处理指针,有时您最终会得到的正是眼花缭乱 :)

于 2012-12-10T23:49:58.490 回答
1

我会这样做:

extern struct tree *sintablein[sintablesize];
struct tree **tablein = sintablein;

// ...

for(i = 0; i < 10; i++) {
    struct tree *tablemember = tablein[i];
    // Do stuff with tablemember
}

请注意,当您这样做时,(*tablein)[i]您正在获取数组的第一个元素tablein并将其视为项目数组struct tree而不是单个struct tree*指针。这可能不是你想要的。

于 2012-12-10T23:50:19.630 回答