Wie arbeiten die Operatoren und arbeiten mit Zeigern?

9

Zum Spaß hatte ich ein std::list von const char* , wobei jedes Element auf eine Null-terminierte Textzeichenfolge zeigt und ein std::list::sort() darauf lief. Wie es passiert, sortierte es (kein Wortspiel beabsichtigt) die Zeichenfolgen nicht. Wenn man bedenkt, dass es an Zeigern arbeitete, macht das Sinn.

Gemäß der Dokumentation von std::list::sort() verwendet (standardmäßig) operator < zwischen den zu vergleichenden Elementen.

Nachdem ich die Liste für einen Moment vergessen habe, lautet meine eigentliche Frage: Wie arbeiten diese (& gt ;, & lt ;, & gt; =, & lt; =) Operatoren an Zeigern in C ++ und C? Vergleichen sie einfach die tatsächlichen Speicheradressen?

%Vor%

z.B. auf einem 32-Bit-Little-Endian-System, p1 & gt; p2 weil 0xDAB0BC47 & gt; 0xBABEC475 ?

Testing scheint dies zu bestätigen, aber ich dachte mir, es wäre gut, StackOverflow für zukünftige Referenz zu verwenden. C und C ++ machen beide einige komische Dinge zu Zeigern, also weißt du nie wirklich ...

    
Oystein 05.01.2011, 17:53
quelle

3 Antworten

17

In C ++ können Sie keine Zeiger mit den relationalen Operatoren vergleichen. Sie können nur zwei Zeiger vergleichen, die auf Elemente im selben Array verweisen, oder zwei Zeiger, die auf Elemente desselben Objekts zeigen. (Sie können natürlich auch einen Zeiger mit sich selbst vergleichen.)

Sie können jedoch std::less und die anderen relationalen Vergleichsfunktionsobjekte verwenden, um zwei beliebige Zeiger zu vergleichen. Die Ergebnisse sind implementierungsdefiniert, aber es ist garantiert, dass es eine Gesamtordnung gibt.

Wenn Sie einen flachen Adressraum haben, ist es wahrscheinlich, dass Zeigervergleiche nur Adressen vergleichen, als wären sie ganze Zahlen.

(Ich glaube, die Regeln sind in C die gleichen, ohne die Vergleichsfunktionsobjekte, aber jemand muss das bestätigen; ich bin bei C nicht annähernd so vertraut wie bei C ++.)

    
James McNellis 05.01.2011, 17:56
quelle
7

Dies ist nur eine Ergänzung.

In C ++ 20.3.3 / 8:

  

Für Vorlagen größer, weniger,   größer gleich und weniger gleich   Spezialisierungen für jeden Zeigertyp   ergibt eine totale Ordnung, auch wenn die   integrierte Operatoren & lt ;, & gt ;, & lt; =, & gt; = do   nicht.

In C 6.5.8 / 5:

  

Wenn zwei Zeiger auf Objekt oder   unvollständige Typen zeigen beide auf die   das gleiche Objekt, oder beide zeigen eine Vergangenheit   das letzte Element des gleichen Arrays   Objekt, vergleichen sie gleich. Wenn die   Objekte, auf die gezeigt wird, sind Mitglieder der   dasselbe Aggregatobjekt, Zeiger auf   Strukturmitglieder, die später deklariert werden   vergleiche größer als Zeiger auf   Mitglieder, die früher in der   Struktur und Zeiger auf Array   Elemente mit größeren tiefgestellten Werten   vergleiche größer als Zeiger auf   Elemente des gleichen Arrays mit niedrigeren   tiefgestellte Werte. Alle Hinweise zu   Mitglieder des gleichen Union-Objekts   vergleiche gleich. Wenn der Ausdruck P   zeigt auf ein Element eines Arrays   Objekt und der Ausdruck Q zeigt auf   das letzte Element des gleichen Arrays   Objekt, der Zeiger Ausdruck Q + 1   vergleicht größer als P. In allen anderen   Fälle, das Verhalten ist nicht definiert .

Also, ich denke, das Vergleichen von char const* , das zu zwei verschiedenen '\ 0'-terminierten Strings gehört, wie in der Frage, ist ein undefiniertes Verhalten (in C).

    
Ise Wisteria 05.01.2011 19:20
quelle
1

Ja, sie vergleichen nur die Speicheradresse.

    
OrangeDog 05.01.2011 17:55
quelle

Tags und Links