Ich weiß, dass die Zeigervergleiche mit <
im C-Standard nur zulässig sind, wenn die Zeiger auf den gleichen Speicherplatz zeigen (wie das Array).
wenn wir ein Array nehmen:
%Vor% vergleicht ptr
mit array+10
erlaubt? Wird der array+10
-Zeiger außerhalb des Array-Speichers betrachtet und ist der Vergleich nicht erlaubt?
Beispiel
%Vor%Ja, ein Zeiger darf auf den Ort direkt hinter dem Ende des Arrays zeigen. Sie dürfen jedoch einen solchen Zeiger nicht ablehnen.
C99 6.5.6 / 8 Additive Operatoren (Hervorhebung hinzugefügt)
wenn der Ausdruck P auf das letzte Element eines Array-Objekts zeigt, Ausdruck (P) +1 zeigt eins nach dem letzten Element des Array-Objekts, und wenn der Ausdruck Q hinter das letzte Element eines Arrays zeigt Objekt, der Ausdruck (Q) -1 zeigt auf das letzte Element des Arrays Objekt. Wenn sowohl der Zeigeroperand als auch das Ergebnis auf Elemente zeigen des gleichen Array-Objekts, oder nach dem letzten Element des Arrays Objekt darf die Bewertung keinen Überlauf erzeugen; ansonsten der Verhalten ist nicht definiert. Wenn das Ergebnis nach dem letzten Element liegt des Array-Objekts soll es nicht als Operand eines Unary verwendet werden Operator, der ausgewertet wird.
Und speziell für Vergleichsoperationen auf Zeigern:
C99 6.5.8 / 5 Relationale Operatoren
Wenn der Ausdruck P auf ein Element eines Array-Objekts zeigt und der Ausdruck Q zeigt auf das letzte Element desselben Array-Objekts, das Zeigerausdruck Q + 1 vergleicht größer als P. In allen anderen Fällen Das Verhalten ist nicht definiert.
Ja, das ist erlaubt, und C ++ stützt sich stark darauf (C benutzt es nicht so sehr, aber in C ++ ist eine sehr gebräuchliche Art, Bereiche zu bezeichnen, ein Zeiger (oder allgemeiner ein Iterator) Zeigen Sie auf das erste Element, und zeigen Sie ein anderes hinter an das Ende des Bereichs.
Es ist zulässig, dass ein solcher Zeiger existiert und dass er mit dem Rest des Arrays verglichen wird.
Aber es ist nicht legal, den Zeiger jemals zu dereferenzieren.
Tags und Links c c++ comparison pointers