Vergleichen von Zeigern mithilfe von relationalen Operatoren
Wenn zwei Zeiger auf Objekte vom gleichen Typs verglichen werden, wird das Ergebnis nach der Position der Objekte bestimmt, auf die im Adressbereich des Programms gezeigt wird. Zeiger können auch mit einem konstanten Ausdruck verglichen werden, der auf 0 oder einen Zeiger vom Typ void * auswertet. Wenn ein Zeiger mit einem Zeiger vom Typ void * verglichen wird, wird der andere Zeiger implizit in den Typ void * konvertiert. Anschließend wird verglichen.
Zwei Zeiger verschiedener Typen können nicht verglichen werden, es sei denn:
Ein Typ ist ein Klassentyp, der vom anderen Typ abgeleitet wird.
Mindestens einer der Zeiger wird explizit in den Typ void * konvertiert (umgewandelt). (Der andere Zeiger wird für die Konvertierung implizit in void * konvertiert.)
Zwei Zeiger desselben Typs, die auf dasselbe Objekt zeigen, sind beim Vergleich garantiert gleich. Wenn zwei Zeiger auf nicht statische Member eines Objekts verglichen werden, gelten folgende Regeln:
Wenn der Klassentyp keine Union ist und wenn die zwei Member nicht durch einen access-specifier, wie öffentlich, geschützt oder privat, getrennt sind, erzielt der Zeiger auf den zuletzt deklarierten Member beim Vergleich einen größeren Wert als der Zeiger auf den zuvor deklarierten Member. (Informationen zu access-specifier finden Sie im Syntaxabschnitt in Zugriffsspezifizierer.)
Wenn die zwei Member durch einen access-specifier getrennt sind, sind die Ergebnisse nicht definiert.
Wenn der Klassentyp eine Union ist, sind Zeiger auf unterschiedliche Datenmember in dieser Union beim Vergleich gleich.
Wenn zwei Zeiger auf Elemente desselben Arrays oder auf ein Element über das Ende des Arrays hinaus zeigen, erzielt der Zeiger auf das Objekt mit dem höheren Index einen höheren Wert. Der Vergleich von Zeigern ist nur dann garantiert gültig, wenn der Zeiger auf Objekte im gleichen Array oder auf die Position verweist, die eine Stelle nach dem Ende des Arrays liegt.