' - >'的基本操作数具有非指针值;但我几乎可以肯定它有指针类型?

时间:2015-01-01 21:24:48

标签: c pointers struct

我已经定义了一个名为wire的结构:

typedef struct wire
{
    char type[9];
    char name[20];
    char value;
    struct io * inp=NULL;
    struct io * outp=NULL;
} wire;

和另一个名为io:

typedef struct io
{
    struct io* next;
    struct log_gate* conn_gate ;
} io;

导线是一种动态的导线阵列。

并且在此行中发生编译错误:

tmp=&wires[i]->outp;

编译错误是:' - >'的基本操作数具有非指针值'wire'

2 个答案:

答案 0 :(得分:2)

首先,我们必须看看两个运营商的优先级。根据{{​​3}},->的优先级高于&。这意味着我们必须在->之前评估&。让我们来看看表达式。

wires[i] /// this returns a wire

由于->的优先级,我们现在评估struct accessor操作。

wires[i]->outp /// because wires[i] is a wire, not a wire *, the -> is misused.

wires[i]只是一个普通的wire,而不是指针,因此我们必须使用.运算符来访问其成员。请注意,-> vs .取决于 struct 的类型,而不是成员的类型。因为 struct 不是指针,所以我们使用.

优先级问题很重要,因为如果&的优先级高于->,则首先评估表达式&wires[i]。这意味着我们正试图进入outp而不是wire *的{​​{1}}字段,wire运算符是合理的。

答案 1 :(得分:2)

写下

tmp = ( &wires[i] )->outp;

tmp = wires[i].outp;

如果wires是指向数组的已分配内存的指针,那么wires[i]是数组的一个元素,其类型为struct wire,它不是指针。所以正确的语法将作为上面显示的语句的第二个例子。

如果您使用此元素的地址(如&wires[i]),则一元运算符&的优先级低于后缀运算符->。因此,您需要将表达式&wires[i]括在括号(&wires[i])中,就像在上面的语句的第一个示例中所示,以获取指针。