我见过几个C代码示例,它们利用(* p) - > some_var方式处理指针(使用指针周围的parens)。
我的问题是,使用C指针的两种方法之间是否有任何功能差异,如果是这样,这种差异是如何产生的呢?
答案 0 :(得分:10)
那些根本不做同样的事情。比较:
(*p)->some_var // aka (*(*p)).some_var
这意味着“p是一个指针,我们取消引用,然后再次取消引用以访问字段。”
*p->some_var // aka *((*p).some_var)
这意味着“p是一个指针,我们取消引用一个字段,这是一个我们取消引用的指针。”
答案 1 :(得分:3)
由于一元*
的优先级低于->
,因此*p->some_var
被解释为*(p->some_var)
,这显然与(*p)->some_var
不同。
第一个取消引用some_var
引用的结构的p
成员(p
此处类似于some_struct *
)
struct some_struct {
int *some_var;
};
some_struct *p = ...;
int v = *p->some_var;
第二个解除引用p
,并访问结果指向的some_var
成员(此处p
是双指针 - some_struct **
)。
some_struct *a = ...;
some_struct **p = &a;
int *val_ptr = (*p)->some_var;
答案 2 :(得分:3)
让我们来看看parens和运营商:
(*p)->some_var
或者,换句话说:
( operator* identifier ) operator-> identifier
现在,让我们看一下operator precedence table,看看它是什么:
Precedence Operator Description ...
1 ... -> ... Structure and union member access through pointer
2 ... * ... Indirection (dereference)
就在那里,我们得到了你的回答:
(operator-with-prec-2 identifier) operator-with-prec-1 identifier
parens有所作为吗?是。如果您有*p->somevar
,由于两个运算符的优先级,它将评估为*(p->somevar)
。插入parens会导致评估发生变化。
如果您不知道parens的效果,则表示您不知道运营商的优先级和/或关联性。打印出那张桌子并把它挂在墙上 - 作为一名专业人士并不羞耻。
答案 3 :(得分:2)
(*p)->some_var
p
是指向结构或联合的指针。它被解除引用,然后访问其字段some_var
。
*p->some_var
p
是一个结构或联合。其字段some_var
已取消引用。