在下面的代码片段中,可以做些什么来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),我如何尽可能地简化指针和解引用?
答案 0 :(得分:1)
隐藏编译器的最好方法是听取它的建议。如果编译器抱怨,那么通常有充分的理由。即使代码有效,也有可能在将来或其他平台上引发问题。
现在,已经说过,有两种方法可以使用编译器:
至于眼睛交叉指针的混乱...你必须更加具体。如果你正在处理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*
指针。这可能不是你想要的。