Nach diesem topic , Vergleichen des Zeigers mit eins nach dem letzten Element eines Array -Objekts ist zulässig.
Und nach dem @jalf -Kommentar ist das Vergleichen des Zeigers mit eins vor dem ersten Element eines Array-Objekts verboten.
Beispiel1
%Vor%Beispiel2
%Vor%1) Sind sowohl example1 als auch example2 verboten?
2) Gibt es einen Beweis aus dem C-Standard, dass das Vergleichen des Zeigers mit eins vor dem ersten Element eines Array-Objekts verboten ist?
array-1
nicht definiert; Im zweiten Fall wird ptr
undefiniert, wenn es nach der Iteration dekrementiert wird, wenn es gleich array
ist. Wenn ein Ausdruck, der einen Integer-Typ hat, zu einem Zeiger addiert oder von ihm subtrahiert wird, hat das Ergebnis den Typ des Zeigeroperanden. Wenn der Zeigeroperand auf ein Element eines Array-Objekts zeigt und das Array groß genug ist, zeigt das Ergebnis auf ein Element, das vom ursprünglichen Element versetzt ist, so dass die Differenz der Indizes der resultierenden und ursprünglichen Arrayelemente gleich dem ganzzahligen Ausdruck ist. Mit anderen Worten, wenn der Ausdruck
P
auf das i-te Element eines Array-Objekts zeigt, die Ausdrücke(P)+N
(äquivalent,N+(P)
) und(P)-N
(wobeiN
den Wertn
hat) zeigen Sie auf die Elementei+n
-th undi−n
-th des Array-Objekts, sofern diese vorhanden sind. Wenn der AusdruckP
auf das letzte Element eines Array-Objekts zeigt, verweist der Ausdruck(P)+1
außerdem auf eins nach dem letzten Element des Array-Objekts, und wenn der AusdruckQ
auf eins nach dem letzten Element eines Arrays zeigt Objekt, zeigt der Ausdruck(Q)-1
auf das letzte Element des Array-Objekts. Wenn sowohl der Zeigeroperand als auch das Ergebnis auf Elemente desselben Arrayobjekts oder eines nach dem letzten Element des Arrayobjekts zeigen, darf die Auswertung keinen Überlauf erzeugen. Andernfalls ist das Verhalten nicht definiert. Wenn das Ergebnis hinter das letzte Element des Array-Objekts zeigt, darf es nicht als Operand eines unären*
-Operators verwendet werden, der ausgewertet wird.
Der Standard ist so lang, dass er das Element an der Position hinter dem letzten Element des Array-Objekts abdeckt, während das Element an der Position eins vor dem ersten Element unter den "sonst" -Klausel der obigen Regel fällt.
Tags und Links c c++ comparison pointers