In Abschnitt §6.5.8 Relationale Operatoren, der C11-Standard (ISO/IEC 9899: 2011) sagt:
Wenn zwei Zeiger verglichen werden, hängt das Ergebnis von den relativen Positionen im Adressraum der Objekte ab, auf die verwiesen wird. Wenn zwei Zeiger auf Objekttypen beide auf das gleiche Objekt zeigen oder beide hinter das letzte Element des gleichen Array-Objekts zeigen, vergleichen sie das Gleiche. Wenn die Objekte, auf die verwiesen wird, Mitglieder desselben Aggregatobjekts sind, vergleichen Zeiger auf später deklarierte Strukturelemente größer als Zeiger auf zuvor in der Struktur deklarierte Elemente, und Zeiger auf Arrayelemente mit größeren tiefgestellten Werten vergleichen größere als Zeiger auf Elemente desselben Arrays mit niedrigeren Indexwerten. Alle Zeiger auf Mitglieder desselben Union-Objekts sind gleich. Wenn der Ausdruck P
auf ein Element eines Array-Objekts zeigt und der Ausdruck Q
auf das letzte Element desselben Array-Objekts zeigt, vergleicht der Zeigerausdruck Q+1
größer als P
. In allen anderen Fällen ist das Verhalten nicht definiert.
Wenn Sie wissen, dass der Zeiger innerhalb der Reichweite des Arrays ist, dann funktionieren Vergleiche. Wenn der Zeiger außerhalb des Bereichs liegt, können Sie nicht sicher sein, dass die Vergleiche funktionieren. In der Praxis ist dies normalerweise der Fall, aber der Standard besagt ausdrücklich, dass der Vergleich zu undefiniertem Verhalten führt.
anzumerken, dass für ein Array SomeType array[20];
, die Adresse &array[20]
garantiert gültig zu sein und zuverlässig mit jeder Adresse von &array[0]
durch &array[19]
zu vergleichen. Sie müssen entscheiden, ob Sie das in Ihrem Array zählen möchten.
Vorbehaltlich der Beobachtung, dass der Standard garantiert nicht, dass es funktionieren wird, dann können Sie zwei int
Zeiger vergleichen:
int within_int_array(int *array, size_t num_ints, int *ptr)
{
return ptr >= array && ptr < array + num_ints;
}
In diesen Tagen sollten Sie immer vorsichtig sein, nicht definiertes Verhalten aufruft. Compiler machen widerliche Dinge mit Programmen, die undefiniertes Verhalten verwenden, und technisch gesehen haben Sie keinen Rückgriff, da der Standard "undefiniertes Verhalten" sagt.
Es gibt wahrscheinlich eine andere Frage, die das fragt. Sorta. Der Standard sagt nicht, dass es funktioniert, aber wenn Sie den Array-Start, die Anzahl der Elemente und die Größe jedes Elements sowie den angegebenen Zeiger kennen, können Sie feststellen, ob der angegebene Zeiger zwischen den Werten liegt Start und das Ende des Arrays.Das Problem ist, wenn der Zeiger außerhalb des Bereichs liegt, wird nicht garantiert, dass die Vergleiche nach dem Standard funktionieren, obwohl heutzutage meistens auf nicht segmentierten Maschinen (die meisten) tatsächlich funktioniert. –
Wenn Sie mit Arrays arbeiten, warum erhalten Sie keine Offsets? Ich meine, eine einfache Ganzzahl, die als Index verwendet wird. So sparen Sie sich die Zugehörigkeitsprüfung. –