Reputation: 2225
If I have a struct like
struct account {
int account_number;
};
Then what's the difference between doing
myAccount.account_number;
and
myAccount->account_number;
or isn't there a difference?
If there's no difference, why wouldn't you just use the .
notation rather than ->
? ->
seems so messy.
Upvotes: 34
Views: 71071
Reputation: 47
Quote from K & R the second edition. :
"The parentheses are necessary in (*pp).x because the precedence of the structure member operator . is higher than *. The expression *pp.x means *(pp.x), which is illegal here because x is not a pointer.
Pointers to structures are so frequently used that an alternative notation is provided as a shorthand."
If pp is a pointer to a structure, then pp->member-of-structure refers to the particular member.
Upvotes: 0
Reputation: 11
printf("Book title: %s\n", book->subject);
printf("Book code: %d\n", (*book).book_code);
Upvotes: 1
Reputation: 21
yes you can use struct membrs both the ways...
one is with DOt:(" . ")
myAccount.account_number;
anotherone is:(" -> ")
(&myAccount)->account_number;
Upvotes: 1
Reputation: 4645
You use .
when you're dealing with variables. You use ->
when you are dealing with pointers.
For example:
struct account {
int account_number;
};
Declare a new variable of type struct account
:
struct account s;
...
// initializing the variable
s.account_number = 1;
Declare a
as a pointer to struct account
:
struct account *a;
...
// initializing the variable
a = &some_account; // point the pointer to some_account
a->account_number = 1; // modifying the value of account_number
Using a->account_number = 1;
is an alternate syntax for (*a).account_number = 1;
I hope this helps.
Upvotes: 31
Reputation: 168886
You use the different notation according to whether the left-hand side is a object or a pointer.
// correct:
struct account myAccount;
myAccount.account_number;
// also correct:
struct account* pMyAccount;
pMyAccount->account_number;
// also, also correct
(*pMyAccount).account_number;
// incorrect:
myAccount->account_number;
pMyAccount.account_number;
Upvotes: 11
Reputation: 12333
If myAccount
is a pointer, use this syntax:
myAccount->account_number;
If it's not, use this one instead:
myAccount.account_number;
Upvotes: 4
Reputation: 4465
-> is a shorthand for (*x).field
, where x
is a pointer to a variable of type struct account
, and field
is a field in the struct, such as account_number
.
If you have a pointer to a struct, then saying
accountp->account_number;
is much more concise than
(*accountp).account_number;
Upvotes: 66