redirection casting?

D

dave

Why is this the same:
(*(*pCurrent).pData).name

as this:
pCurrent->pData->name

what is the benefit to the first? if any?
why are the parenthesis important?

thanks
 
M

Marcus Kwok

dave said:
Why is this the same:
(*(*pCurrent).pData).name

as this:
pCurrent->pData->name

The x->y notation is really shorthand for (*x).y; it was originally used
in C to access members of a struct through a pointer, since passing
structs by value can be expensive. Therefore,

(*pCurrent).pData == pCurrent->pData

Applying this again to pData, we have
(*(*pCurrent).pData).name == (pCurrent->pData)->name
== pCurrent->pData->name

what is the benefit to the first? if any?
why are the parenthesis important?

The parentheses are important because without them, it would be
interpreted as *(pCurrent.pData) which is an error, since pCurrent is a
pointer and pointers cannot have fields; however, (*pCurrent) is the
struct (or class) pointed to by pCurrent, so that is allowed to have a
field named pData.
 
G

Greg

dave said:
Why is this the same:
(*(*pCurrent).pData).name

as this:
pCurrent->pData->name

what is the benefit to the first? if any?
why are the parenthesis important?

thanks

The "arrow" operator provides access to the members and methods of a
class or struct, given a pointer to the struct or class instance. The
"." operator provides the same access, given a direct instance of a
struct or class object. Lastly, the dereference operator, *, obtains a
the instance of a struct or class object given a pointer to it.

When these three operators are considered together, it becomes clear
that dereferencing and then applying the period operator to a pointer
is equivalent to applying the arrow operator to that pointer. In other
words:

pCurrent->pData->name

should be equivalent to this:

**pCurrent.pData.name

But it is not. The catch is that the order in which the * and the .
operators are applied to this expression affects the outcome. In fact
the compiler follows a strict "order of precedence" when deciding
whether to apply the * or the . operator first. When evaluating the
above expression the compiler appies the operators in this order:

**pCurrent.pData.name
43 1 2 // <- order of operator evaluation

The problem is that trying to apply the operators in this order, fails.
Instead, the compiler has to alternate between the two . and *
operators in order for this expression to make sense. Since parentheses
have a very high precedence, using them forces the compiler to apply
the operators in the desired order: first the *, then a ., then the
other *, and finally the last . before "name" like so

(*(*pCurrent).pData).name
3 1 2 4

Whether to use the -> or *. operator is largely a matter of preference
in this case. Neither is more efficient or better than the other it
terms of the compiled code.

Greg
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top