Est (*pointer)->name
la même chose que pointer->name
o (*pointer).name
?
Réponses
Trop de publicités?Non.
(*pointer)->name
dit "Prends la chose qui pointer
pointe vers. Récupérez la structure vers laquelle il pointe et récupérez l'élément name
membre de celui-ci." Pour que ça marche, pointer
doit être un pointeur vers un pointeur vers une structure. Par exemple, il aurait pu être déclaré comme struct foo **pointer
.
pointer->name
dit "Obtenez la structure qui pointer
et obtenir le name
membre de celui-ci." Pour que ça marche, pointer
doit être un pointeur vers une structure. Il aurait pu être déclaré comme struct foo *pointer
.
(*pointer).name
dit "Obtenez la structure qui pointer
pointe vers. Obtenez le name
membre de celui-ci". Il doit également s'agir d'un pointer
à une structure.
(La seule différence entre les deux derniers est que le second utilise un opérateur dans le code source. Les opérations réellement effectuées sont les mêmes).
En C, le a->b
est un raccourci de l'opérateur (*a).b
.
struct foo {
int b;
};
// the . operator is used when the struct object is NOT a pointer
struct foo a;
a.b = 42;
// the -> operator is used when the struct object IS a pointer
struct foo *a = malloc(sizeof *a);
a->b = 42;
// the same thing as the above example, but using the dot operator
(*a).b = 42;
Le dernier exemple est le déréférencement du a
(en récupérant l'objet vers lequel il pointe), puis en utilisant l'opérateur point pour accéder à l'élément b
à l'intérieur de celui-ci. Maintenant, traduisons votre question.
// first one
(*a)->b;
// would be the same as:
(*(*a)).b;
// that is:
(**a).b;
// which would be used in
struct foo **a ... ;
(**a).b; // get the first element of the array, access field b
// second example
a->b;
// is the same as
(*a).b;
// which is your third example