Confronto tra puntatori tramite operatori relazionali
Quando vengono confrontati due puntatori a oggetti dello stesso tipo, il risultato è determinato dalla posizione degli oggetti puntati nello spazio degli indirizzi del programma. I puntatori possono essere confrontati anche con un'espressione costante che restituisce 0 o con un puntatore di tipo void *. Se si confronta un puntatore con un puntatore di tipo void *, il primo puntatore viene convertito nel tipo void * in modo implicito. A questo punto, viene eseguito il confronto.
Non è possibile eseguire il confronto di due puntatori di tipo diverso, tranne nei seguenti casi:
Un tipo è un tipo di classe derivato dall'altro tipo.
Almeno uno dei puntatori viene convertito in modo esplicito (cast) nel tipo void *. L'altro puntatore viene convertito in modo implicito nel tipo void * per la conversione.
Due puntatori dello stesso tipo che puntano allo stesso oggetto risultano sicuramente uguali. Se due puntatori a membri non statici di un oggetto vengono confrontati, è necessario rispettare le seguenti regole:
Se il tipo di classe non è un'unione e se i due membri non sono separati da access-specifier, come pubblico, protetto o privato, il puntatore al membro dichiarato per ultimo risulta maggiore del puntatore al membro dichiarato in precedenza. Per informazioni su access-specifier, vedere la sezione Sintassi in Identificatori di accesso.
Se i due membri sono separati da access-specifier, i risultati non sono definiti.
Se il tipo di classe è unione, i puntatori a membri dati diversi in tale unione risultano uguali.
Se due puntatori puntano a elementi della stessa matrice o all'elemento uno oltre la fine della matrice, il puntatore all'oggetto con indice maggiore risulta maggiore. Il confronto tra puntatori è sicuramente valido solo quando i puntatori fanno riferimento a oggetti nella stessa matrice o alla posizione uno oltre la fine della matrice.