Drucken a + p, p + a, p-a gibt eine Adresse, aber a-p gibt mir einen Fehler. Warum ist das so? Sind Zeigeradressen keine ganzen Zahlen? Und wenn ja, sollte a-p mir keinen negativen Wert geben?Subtrahieren Zeiger von einer Ganzzahl
Antwort
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, soint64_t *p
Inkrementieren wird anderes Ergebnis aus Inkrementierenint8_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.
- 1. Warnung: Initialisierung macht Zeiger von Ganzzahl ohne Besetzung (Integer-Zeiger)
- 2. Struct Zeiger typecasting Fehlerzuordnung macht Zeiger von Ganzzahl ohne Guss
- 3. Vergleich zwischen Zeiger und Ganzzahl
- 4. Subtrahieren von einer 'DateTime'
- 5. Subtrahieren von einer Variablen
- 6. Kann ich eingeschränkte Zeiger subtrahieren oder vergleichen?
- 7. Warnung Vergleich zwischen Zeiger und Ganzzahl
- 8. Speichern vorzeichenloser Ganzzahl in einem Zeiger
- 9. Subtrahieren einer ArrayList von einer anderen ArrayList
- 10. Array von Ganzzahlen gegenüber Zeiger auf Ganzzahl in C++
- 11. strcmp() geben Segmentation fault: 11 und Zeiger von Ganzzahl Warnung
- 12. ‚getaddrinfo‘ erzeugt Zeiger von Ganzzahl ohne cast [standardmäßig aktiviert]
- 13. Zeiger von Ganzzahl ohne Cast Warnung beim Aufruf lfind
- 14. Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne cast [standardmäßig aktiviert]
- 15. Subtrahieren einer SUMME?
- 16. subtrahieren eine konstante Anzahl von einer Spalte
- 17. Pandas: einfache numerische subtrahieren von einer Spalte
- 18. Subtrahieren von Spalte Zeitstempel
- 19. Subtrahieren von TimeDate-Spalten
- 20. c gtk warning: Initialisierung macht Ganzzahl vom Zeiger
- 21. Warnung "Rückgabe macht Zeiger aus Ganzzahl ohne Besetzung"
- 22. Schnell. Get binary string von einer Ganzzahl
- 23. Entfernen von Nullen vom Ende einer Ganzzahl
- 24. Subtrahieren Variablen in einer Schleife
- 25. Wird der Zeiger nicht gleich dem der Ganzzahl erhöht?
- 26. Subtrahieren von VBA-Variablen
- 27. Subtrahieren von verschiedenen Zeilen
- 28. xslt - Subtrahieren von Tagen
- 29. Generieren einer eindeutigen Ganzzahl-ID aus zwei Ganzzahl-IDs
- 30. Subtrahieren von Daten mit Python