Heim >Backend-Entwicklung >C++ >Wie vergleiche ich Zeiger auf Gleichheit und Reihenfolge in C sicher?

Wie vergleiche ich Zeiger auf Gleichheit und Reihenfolge in C sicher?

Susan Sarandon
Susan SarandonOriginal
2024-12-03 09:08:11341Durchsuche

How Do I Safely Compare Pointers for Equality and Ordering in C  ?

Vergleich von Zeigern für Gleichheit: eine exemplarische Vorgehensweise für den C-Standard

In C kann der Vergleich von Zeigern für Gleichheit unkompliziert sein, erfordert jedoch Einhaltung auf spezifische Regeln, die im Sprachstandard festgelegt sind.

Gleichheitsoperator (==, !=)

Für Zeiger desselben Typs liefert der Gleichheitsvergleich mit == oder != intuitive Ergebnisse. Zwei Zeiger sind gleich, wenn sie beide null sind, beide auf dieselbe Funktion zeigen oder beide auf dieselbe Adresse zeigen.

Relationale Operatoren (<, >, <=, >= )

Zeiger desselben Typs können auch mithilfe von Vergleichsoperatoren verglichen werden. Wenn sie auf dasselbe Objekt oder dieselbe Funktion zeigen, vergleichen sie wie erwartet: p<=q und p>=q ergeben true, während pq false ergeben.

Wenn die Zeiger jedoch zeigen auf verschiedene Objekte oder Funktionen beziehen oder wenn eines davon null ist, sind die Ergebnisse relationaler Vergleiche nicht spezifiziert. Dies bedeutet, dass ihr Verhalten von der Implementierung abhängt.

Ausnahmen von der Regel

Array-Elemente: Wenn Zeiger auf Elemente desselben Arrays zeigen , der Zeiger auf das Objekt mit einem höheren Index ist größer.

Gewerkschaftsmitglieder: Wenn Zeiger zeigen auf Mitglieder derselben Union, sie sind nach der Konvertierung in void* gleich.

Andere Arten von Zeigern:

  • Zeiger auf nicht statisches Mitglied Funktionen: Das Bestellergebnis ist nicht spezifiziert.
  • Zeiger auf nicht statische Datenelemente desselben Objekts mit unterschiedlicher Zugriffskontrolle: Das Bestellergebnis ist nicht spezifiziert.
  • Zeiger auf nicht statische Datenelemente desselben Union-Objekts: Sie werden nach der Konvertierung in void* als gleich angesehen.

Vorbehalte

  • Zeiger auf verschiedene globale Variablen können nicht mit relationalen Operatoren verglichen werden.
  • Zeiger auf lokale Variablen können danach nicht verglichen werden Der Gültigkeitsbereich der Variablen ist beendet.

Bonus: Standardbibliotheks-Helfer

Die Standardbibliothek stellt die Vorlagenfunktionen std::greater, std::less bereit , std::greater_equal und std::less_equal, die zum Ordnen jeder Art von Zeiger verwendet werden können, auch wenn integrierte Operatoren vorhanden sind kann nicht.

Das obige ist der detaillierte Inhalt vonWie vergleiche ich Zeiger auf Gleichheit und Reihenfolge in C sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn