(* p) - > some_var和* p-> some_var之间的任何功能差异

时间:2017-08-29 23:20:06

标签: c

我见过几个C代码示例,它们利用(* p) - > some_var方式处理指针(使用指针周围的parens)。

我的问题是,使用C指针的两种方法之间是否有任何功能差异,如果是这样,这种差异是如何产生的呢?

4 个答案:

答案 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已取消引用。

相关问题