清理C代码中的指针

时间:2012-12-10 23:45:27

标签: c pointers compiler-warnings

在下面的代码片段中,可以做些什么来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),我如何尽可能地简化指针和解引用?

2 个答案:

答案 0 :(得分:1)

隐藏编译器的最好方法是听取它的建议。如果编译器抱怨,那么通常有充分的理由。即使代码有效,也有可能在将来或其他平台上引发问题。

现在,已经说过,有两种方法可以使用编译器:

  1. 调整警告灵敏度。
  2. 使用演员表(通常可以通过明确的演员表来解决投诉)。
  3. 至于眼睛交叉指针的混乱...你必须更加具体。如果你正在处理C,你几乎就要处理指针,有时候眼睛正好会是你最终会遇到的:)

答案 1 :(得分: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*指针。这可能不是你想要的。