Je dois également ajouter quelque chose. La structure est un peu différente du tableau car le tableau est un pointeur et la structure ne l'est pas. Donc sois prudent!
Disons que j'écris ce morceau de code inutile:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
Ici, le pointeur ptr
pointe vers l'adresse ( ! ) De la variable de structure audi
mais à côté de la structure d'adresse a également un morceau de données ( ! )! Le premier membre du bloc de données a la même adresse que la structure elle-même et vous pouvez obtenir ses données en ne déréférençant qu'un pointeur comme celui-ci *ptr
(pas d'accolades) .
Mais si vous voulez acess tout autre membre que le premier, vous devez ajouter un code comme .km
, .kph
, .kg
qui ne sont rien de plus que des compensations à l'adresse de base du bloc de données ...
Mais en raison de la priorité, vous ne pouvez pas écrire *ptr.kg
car l'opérateur d'accès .
est évalué avant l'opérateur de déréférence *
et vous obtiendrez *(ptr.kg)
ce qui n'est pas possible car le pointeur n'a pas de membres! Et le compilateur le sait et émettra donc une erreur, par exemple:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
Au lieu de cela vous utilisez ce (*ptr).kg
et vous forcer compilateur 1er déréférencer le pointeur et activez acess au bloc de données et 2 vous ajoutez un décalage (désignateur) de choisir le membre.
Vérifiez cette image que j'ai faite:
Mais si vous aviez des membres imbriqués, cette syntaxe deviendrait illisible et a donc ->
été introduite. Je pense que la lisibilité est la seule raison justifiable de l'utiliser, car elle ptr->kg
est beaucoup plus facile à écrire qu'à (*ptr).kg
.
Maintenant, écrivons ceci différemment afin que vous puissiez voir la connexion plus clairement. (*ptr).kg
⟹ (*&audi).kg
⟹ audi.kg
. Ici, j'ai d'abord utilisé le fait qu'il ptr
s'agit d'une "adresse de audi
" c'est &audi
-à- dire le fait que les opérateurs "référence" &
et "déréférencement" *
s'annulent.