views:

64

answers:

3

I recently came along this line of code:

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

And I thought, isn't:

a->b

just syntactic sugar for:

(*a).b

With that in mind, this line could be re-written as:

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

If that's the case, what is the point of passing in

&(*a), as a parameter, and not just a? It seems like the pointer equivalent of -(-a) is being passed in in, is there any logic for this?

Thank you.

+6  A: 

This:

&(*em).vdata

is not the same as this:

em.vdata

It is the same as this:

&((*em).vdata)

The ampersand takes the address of vdata, which is a member of the struct pointed to by em. The . operator has higher precedence than the & operator.

James McNellis
On a totally unrelated note, I find it near impossible to take anyone on here seriously with all of these unicorns.
James McNellis
But James, they're '-~*unicorns*~-'. <:D
GMan
Leif Andersen
@Leif Andersen: Yes, `(
Jefromi
@Leif Andersen: You can google around for C operator precedence; here's the table on wikipedia: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
Jefromi
Hmm...okay, thanks. But the member selection operator is still the operator used to get a particular variable from a struct, yes? (I always called that the dot operator, or possibly dot product, even though the latter could be confused with vectors in mathematics), thanks for making me aware of the notation.
Leif Andersen
@Leif: Yes, it is used to get a particular variable from a struct. It's acceptable to call it the "dot operator," but it _cannot_ be called the "dot product operator."
James McNellis
Please don't eat unicorns.
GMan
+1  A: 

Here's what you're missing: &em->vdata is the same as &(em->vdata), not (&em)->vdata. That is, it's the address of the vdata member of the structure pointed to by em. This should be clear if you look at the type of em - it's a pointer.

Yes, you can always rewrite a_ptr->member as (*a_ptr).member, but why bother? That's the point of the syntactic sugar.

Jefromi
A: 

"If that's the case, what is the point of passing in &(*a), as a parameter, and not just a?"

Usually none. But notice that your sample code doesn't compare &(*a) and a. Your sample code compares &(*a) and b, where b is offset from a by whatever the distance is from the start of em to em's vdata member.

Windows programmer