2017-01-26 5 views

Antwort

2

In Bezug auf Zeigerarithmetik sind Zeiger nicht äquivalent zu "Ganzzahl, die eine Adresse darstellt". Auch ist zusätzlich nicht so einfach:

  • Sie nicht Zeiger
  • p+1 Schreiben bedeutet nicht, „Adresswert von p Variable erhalten und erhöhen sie durch ein“ auf Zeiger hinzufügen können. Tatsächliche Adresse Erhöhungsbetrag ist abhängig von der Größe des spitzen variabel, so int64_t *p Inkrementieren wird anderes Ergebnis aus Inkrementieren int8_t *p

Warum tun wir so „seltsames Verhalten“ für die Addition und Subtraktion von Zeigern haben? Einfache Antwort: weil es auf diese Weise in C++ Standard definiert ist:

5,7 Additive Operatoren

Für hinaus entweder beide Operanden werden arithmetische oder unscoped Aufzählungstyp haben oder einen Operanden wird ein Zeiger auf eine vollständig sein -definierter Objekttyp und der andere muss Integral- oder Unscoped-Aufzählungstyp haben.

Für Subtraktion, eine der folgenden Arten halten:

- beide Operanden arithmetische oder unscoped Aufzählungstyp; oder

- beide Operanden sind Zeiger auf cv-qualifizierte oder cv-unqualifizierte Versionen desselben vollständig definierten Objekttyps; oder

- Der linke Operand ist ein Zeiger auf einen vollständig definierten Objekttyp und der rechte Operand hat einen integrierten oder nicht gekürzten Aufzählungstyp.

Aber es gibt einen Grund hinter dieser Einschränkung (die eigentlich auf der gleichen Seite des Standards beschrieben wird). Die Zeigerarithmetik ist für folgende Verwendung vorgesehen: Wenn auf ein Element im Array zeigt, zeigt p+1 auf das nächste Element, p-1 zeigt auf das vorherige Element und p1-p2 zeigt die Anzahl der Elemente zwischen p1 und p2 an. In diesen Begriffen p1+p2 macht keinen Sinn, das gleiche für 1-p, so dass sie als Syntaxfehler behandelt werden.

Verwandte Themen