* opérateur d'indirection
-> opérateur d'accès à un champ, à partir d'un pointeur
Description:
* opérateur utilisable sur une variable pointeur, fournissant l'objet pointé (indirection), c'est à dire l'objet dont l'adresse est contenue dans le pointeur et dont le type est précisé par ce pointeur.
Cela suppose que le pointeur n'est pas de type 'void *', mais aussi qu'un changement de type n'a pas été imposé au pointeur.
Il ne faut pas confondre '*', opérateur d'indirection et l'usage de '*' dans une déclaration de pointeur.
Attention: *(char *)p_ii désigne le caractère à l'adresse p_ii. Suivant la machine, il correspond à l'octet de plus fort poids de ii ou à l'octet de plus faible poids !!! Il faut limiter le changement de type des pointeurs aux seuls cas nécessités par l'usage de fonctions générales comme malloc() par exemple, qui renvoient une adresse de type 'void *' devant être affectée à un pointeur sur des objets typés.
L'opérateur binaire -> associe un pointeur sur un agrégat et un champ de cet agrégat; il fournit le champ de l'agrégat dont l'adresse est dans le pointeur.
L'utilisation de l'opérateur * peut se substituer à ' -> ' mais au détriment de la clarté d'écriture.
Voir aussi:
Exemple:
Avec les déclarations:
int ii, *p_ii, ti[18];
struct agr { char cc; int te[5] } aa, *p_a;
après l'affectation: p_ii = & ii;
*p_ii et ii désignent les mêmes objets
*(ti+3) et ti[3] désignent les mêmes objets
après l'affectation: p_ii = & ti[5];
*p_ii et ti[5] désignent les mêmes objets
après l'affectation: p_a = & aa;
*p_a et aa désignent les mêmes objets
(*p_a).te[2] et aa.te[2] désignent les mêmes objets
Après l'affectation: p_a = & aa;
pa->cc et aa.cc désignent les mêmes objets
pa->te[2] et aa.te[2] désignent les mêmes objets
pa->te[2] et (*p_a).te[2] désignent les mêmes objets