/ / Pourquoi C a-t-il les deux? et -> pour s'adresser aux membres struct? [dupliquer] - c

Pourquoi C a les deux. et -> pour s’adresser aux membres de la structure? [dupliquer] - c

Duplication possible:
Pourquoi l'opérateur flèche (->) en C existe-t-il?

Pourquoi C a-t-il les deux . et -> pour s'adresser aux membres struct?

Est-il possible d'avoir une telle syntaxe de langage modifiée, où nous pouvons prendre p comme pointeur vers struct et obtenir la valeur d'un membre struct tout comme p.value?

Réponses:

3 pour la réponse № 1

Vous pouvez penser à p->m comme raccourci pour (*p).m


3 pour la réponse № 2

D'après la spécification C99.

Le premier opérande du . l'exploitant doit avoir une structure ou un syndicat qualifié ou non qualifié et le deuxième opérande doit nommer un membre de ce type.

Le premier opérande du -> l'opérateur doit avoir le type pointeur vers qualifié ou non qualifié structure ou pointeur vers un syndicat qualifié ou non qualifiéet le deuxième opérande doit nommez un membre du type indiqué.

Je suppose que, à des fins d'identification, ils ont utilisé deux opérateurs pour l'accès des membres. c'est-à-dire que pour la variable struct de type pointeur est -> et . pour la variable de structure ordinaire.

Par exemple:

struct sample E, *E1;

l'expression (&E)->MOS est le même que E.MOS et
(*E1).MOS est le même que E1->MOS


2 pour la réponse № 3

C'est possible? Oui. La syntaxe est la suivante:

(*ptr).member

Les parenthèses sont obligatoires car le opérateur de membre de structure . a une priorité plus élevée que la opérateur d'indirection *. Mais après l'avoir utilisé plusieurs fois, vous conviendrez que ce qui suit est plus facile à utiliser:

ptr->member

Pourquoi C a-t-il les deux? Les pointeurs vers les structures sont utilisés si souvent en C qu’un opérateur spécial a été créé, appelé opérateur pointeur de structure ->. Son travail consiste à exprimer plus clairement et plus facilement les pointeurs vers les structures.


0 pour la réponse № 4

. est pour la variable struct, et -> est pour le pointeur. Si p est un pointeur, vous pouvez faire p-> valeur ou (* p) .value, ce sont les mêmes.