web-dev-qa-db-fra.com

Différence entre -> et. dans une structure?

Si j'ai une structure comme

struct account {
   int account_number;
};

Alors quelle est la différence entre faire

myAccount.account_number;

et

myAccount->account_number;

ou n'y a-t-il pas une différence?

S'il n'y a pas de différence, pourquoi ne pas simplement utiliser la notation . plutôt que ->? -> semble tellement en désordre.

21
Sam

-> est un raccourci pour (*x).field, où x est un pointeur sur une variable de type struct account, et field est un champ de la structure, tel que account_number.

Si vous avez un pointeur sur une structure, alors dites

accountp->account_number;

est beaucoup plus concis que

(*accountp).account_number;
38
rmk

Vous utilisez . lorsque vous traitez avec des variables. Vous utilisez -> lorsque vous traitez avec des pointeurs.

Par exemple:

struct account {
   int account_number;
};

Déclarez une nouvelle variable de type struct account:

struct account s;
...
// initializing the variable
s.account_number = 1;

Déclarez a en tant que pointeur sur 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

Utiliser a->account_number = 1; est une syntaxe alternative pour (*a).account_number = 1;

J'espère que ça aide.

21
bacchus

Vous utilisez la notation différente selon que le côté gauche est un objet ou un pointeur.

// 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;
7
Robᵩ

-> est un pointeur dereference et. accesseur combiné

3
Grady Player

Si myAccount est un pointeur, utilisez cette syntaxe:

myAccount->account_number;

Si ce n'est pas le cas, utilisez celui-ci à la place:

myAccount.account_number;
3

oui, vous pouvez utiliser struct membrs les deux manières ...

on est avec DOt :( ". ")

myAccount.account_number;

une autre personne est :( " -> ")

(&myAccount)->account_number;
0
teja