Tableau de structures et arithmétique de pointeur

Comment accéder aux tableaux de structures à l’aide de l’arithmétique de pointeur?

supposons que j’ai une structure

struct point{ int x; int y; }collection[100]; 

Supposons que j’ai une fonction

 int func(struct point *collection,int size) 

Dans cette fonction, j’accède à l’élément comme indiqué ci-dessous.

 collection[0].x 

Est-ce la même chose que *(collection + 0).x ? Depuis le . L’opérateur a une priorité plus élevée que l’opérateur * , d’abord le pointeur de la collection est incrémenté de 0, puis l’opérateur Point est appliqué, puis le pointeur déréférencé? D’une certaine manière, cela n’a pas de sens; toute clarification est appréciée.

Est-ce la même chose que *(collection + 0).x ?

Votre explication est absolument correcte, a une priorité supérieure à * , de sorte que la deuxième expression est analysée comme *((collection + 0).x) . collection[i].x , par contre, est équivalent à (*(collection + i)).x .

En fait, cette maladresse est la raison pour laquelle l’opérateur -> été introduit. Par conséquent, en supposant que y soit une expression non sortingviale, vous pouvez écrire

 y->x 

au lieu de

 (*(y)).x 

Bien que, évidemment, collection[0].x soit bien plus propre que (collection + 0)->x dans ce cas particulier.