Comparaison des pointeurs utilisant des opérateurs relationnels
Lorsque deux pointeurs vers des objets du même type sont comparés, le résultat est déterminé par l'emplacement des objets pointés figurant dans l'espace d'adressage du programme. Les pointeurs peuvent également être comparés à une expression constante qui correspond à 0 ou à un pointeur de type void *. Si une comparaison de pointeur est effectuée par rapport à un pointeur de type void *, l'autre pointeur est implicitement converti en type void *. Ensuite la comparaison est effectuée.
Deux pointeurs de types différents ne peuvent pas être comparés à moins que :
Un type est un type de classe dérivé de l'autre type.
Au moins un des pointeurs est explicitement converti (cast) pour taper void *. (L'autre pointeur est implicitement converti en type void * pour la conversion.)
Deux pointeurs du même type qui pointent vers le même objet ont la garantie d'être de comparer une valeur égale. Si deux pointeurs vers des membres non statique d'un objet sont comparés, les règles suivantes s'appliquent :
Si le type de classe n'est pas une union, et si les deux membres ne sont pas séparés par un access-specifier de type public, protected ou private, le pointeur vers le membre déclaré en dernier fera une comparaison supérieure à celle du pointeur vers le membre déclaré avant. (Pour plus d'informations sur access-specifier, consultez la section Syntaxe dans Spécificateurs d'accès.)
Si les deux membres sont séparés par access-specifier, les résultats sont non définis.
Si le type de classe est une union, les pointeurs vers les données membres de cette union comparent une valeur égale.
Si les deux pointeurs pointent vers des éléments du même tableau ou vers l'avant dernier élément du tableau, le pointeur vers l'objet avec l'indice le plus élevé compare une valeur supérieure. La comparaison des pointeurs est garantie comme étant valide uniquement lorsque les pointeurs font référence à des objets du même tableau ou à l'emplacement situé après la fin du tableau.