JimR
JimR

Reputation: 2225

Difference between -> and . in a struct?

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

Answers (8)

mortenlund
mortenlund

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

speCial
speCial

Reputation: 11

printf("Book title: %s\n", book->subject); printf("Book code: %d\n", (*book).book_code);

Upvotes: 1

teja
teja

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

CRM
CRM

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

Robᵩ
Robᵩ

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

Juan Pablo Califano
Juan Pablo Califano

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

rmk
rmk

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

Grady Player
Grady Player

Reputation: 14539

-> is a pointer dereference and . accessor combined

Upvotes: 5

Related Questions