我已经定义了一个名为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'
答案 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])
中,就像在上面的语句的第一个示例中所示,以获取指针。