在C中将指针取消引用作为参数的目的

时间:2010-04-01 03:53:19

标签: c pointers indirection

我最近出现了这行代码:

CustomData_em_free_block(&em->vdata, &eve->data);

我想,不是:

a->b

只是语法糖:

(*a).b

考虑到这一点,这一行可以重写为:

CustomData_em_free_block(&(*em).vdata, &(*eve).data);

如果是这种情况,那么传递的内容是什么?

&(* a),作为参数,而不只是一个?看起来像 - ( - a)的指针等效传入,是否有任何逻辑?

谢谢。

3 个答案:

答案 0 :(得分:5)

此:

&(*em).vdata

与此不同:

em.vdata

与此相同:

&((*em).vdata)

&符号取vdata的地址,em.指向的结构的成员。 &运算符的优先级高于{{1}}运算符。

答案 1 :(得分:1)

以下是您遗失的内容:&em->vdata&(em->vdata)相同,而非(&em)->vdata。也就是说,它是vdata指向的结构的em成员的地址。如果你看一下em的类型,它应该是清楚的 - 它是一个指针。

是的,您始终可以将a_ptr->member重写为(*a_ptr).member,但为什么要这么做呢?这就是语法糖的重点。

答案 2 :(得分:-1)

“如果是这种情况,传入&(* a)作为参数的重点是什么,而不仅仅是?”

通常没有。但请注意,您的示例代码不会比较&(* a)和a。您的示例代码比较&(* a)和b,其中b与a的距离从em的起点到em的vdata成员的距离偏移。