Zeigerarithmetik

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Zeiger - Index (C++)

Die Zeigerarithmetik beschränkt sich auf Addition, Subtraktion und Vergleich. Arithmetische Operationen bei Zeigern vom Typ "Zeiger auf type" berücksichtigen automatisch die Größe des Typs type, d.h., die Anzahl der Bytes, die für das Speichern des Objeks type notwendig sind.

Die intern ausgeführte Zeigerarithmetik richtet sich nach dem aktuellen Speichermodell und dem Vorhandensein von überschreibenden Zeiger-Modifizierern.

Bei Berechnungen mit Zeigern wird davon ausgegangen, dass der Zeiger auf ein Array von Objekten zeigt. So wird ein Zeiger, wenn er als Zeiger auf den Typ type deklariert ist, bei Hinzufügen eines Integerwertes um die Anzahl der Objekte vom Typ type weitergesetzt. Wenn type die Größe 10 (Byte) hat und der Integerwert 5 zu einem Zeiger auf type hinzukommt, erhöht sich der Wert der Speicheradresse um 50 (Bytes). Die Differenz ist die Anzahl der Array-Elemente, um die sich die beiden Zeiger voneinander unterscheiden. Wenn zum Beispiel ptr1 auf das dritte Element eines Array und ptr2 auf das zehnte Element des Arrays zeigt, dann ist das Ergebnis von ptr2 – ptr1 gleich 7.

Die Differenz zwischen zwei Zeigern ergibt nur einen sinnvollen Wert, wenn beide Zeiger in das gleiche Array verweisen.

Wenn ein Integerwert zu einem "Zeiger auf type" addiert oder von ihm subtrahiert wird, ist das Ergebnis ebenfalls vom Typ "Zeiger auf type".

Es gibt natürlich keinen "Zeiger auf das Element nach dem letzten Element", aber ein Zeiger kann diesen Wert annehmen. Wenn P auf das letzte Array-Element zeigt, ist P + 1 zulässig, aber P + 2 undefiniert. Wenn P auf das Element nach dem letzten Array-Element zeigt, ist P – 1 zulässig und ergibt einen Zeiger auf das letzte Element. Die Anwendung des Zeigeroperators * auf einen "Zeiger auf das Element nach dem letzten Element" führt jedoch zu undefiniertem Verhalten.

Sie können sich P + n als Inkrementierung des Zeigers um (n * sizeof(type)) Bytes vorstellen, solange der Zeiger innerhalb des zulässigen Bereichs bleibt (vom ersten Element bis zu dem Element nach dem letzten Element).

Wenn zwei Zeiger auf Elemente desselben Arrays subtrahiert werden, erhält man einen Integerwert vom Typ ptrdiff_t, der in stddef.h definiert ist. Dieser Wert stellt die Differenz zwischen den Indizes der beiden referenzierten Elemente dar, vorausgesetzt, sie liegt im Bereich von ptrdiff_t. Im Ausdruck P1 – P2, wobei P1 und P2 Zeiger auf den Typ type sind (oder Zeiger auf den qualifizierten Typ type), müssen P1 und P2 auf existierende Elemente zeigen oder auf das Element nach dem letzten Element. Wenn P1 auf das i-te Element und P2 auf das j-te Element zeigt, hat P1 – P2 den Wert (i – j).