10.6 Zeigerarithmetik
Bei der Zeigerarithmetik (bzw. auch Pointer-Arithmetik) ist die Rede vom Zugriff auf die Zeiger ohne den Indirektionsoperator *. Es geht also rein um die Verwendung von Operatoren für Zeiger und nicht um deren Werte bzw. Objekte, auf die sie zeigen. In der Praxis werden Sie die Zeigerarithmetik häufig in Verbindung mit den C-Arrays verwenden. Folgende Operationen sind mit den Zeigern erlaubt:
-
Vergleiche zweier Zeiger (zeiger1 op zeiger2) mit folgenden Operatoren für op: ==, !=, <, <=, > und >=. Die Verwendung von Vergleichsoperatoren ist allerdings nur dann sinnvoll, wenn die Zeiger auf Array-Elemente zeigen. Beide Zeiger müssen außerdem von demselben Typ sein, bzw. einer der Zeiger kann der NULL-Zeiger sein. So liefert beispielsweise ein Vergleich von zeiger1 > zeiger2 wahr zurück, wenn die Speicheradresse von zeiger1 höher als die Adresse von zeiger2 ist. Auch wird ein Vergleich oft benutzt, um zu bestimmen, ob ein Zeiger ein NULL-Zeiger ist.
-
Subtraktion zweier Zeiger (zeiger2 - zeiger1) mit dem Operator -. Als Ergebnis der Subtraktion von zeiger2 – zeiger1 wird die Anzahl der Elemente zwischen den Zeigern zurückgegeben. Hierzu finden Sie in der Header-Datei stddef.h den Typ ptrdiff_t definiert. Die Subtraktion von zwei Zeigern, die nicht auf dasselbe Array zeigen, ist ein logischer Fehler.
-
Addition und Subtraktion eines Zeigers mit einer Ganzzahl (zeiger op integer) mit den Operatoren +, -, +=, -= für op und den Inkrement- bzw. Dekrementoperatoren ++ und --. Zeigt beispielsweise der Zeiger zeiger1 auf das Array-Element array[i], bedeutet eine Zuweisung des Zeigers mit zeiger2=zeiger1+2, dass zeiger2 auf das Array-Element array[i+2] zeigt. Auch ist es möglich, Zeiger mit ++ und -- zu inkrementieren bzw. zu dekrementieren.
Zuweisungen mit Zeigern
An dieser Stelle sollen noch ein paar Besonderheiten zu den Zuweisungen mit Zeigern genannt werden. Sie können einen Zeiger vom Typ void* jederzeit dem Zeiger eines anderen Datentyps zuweisen. Auch können Sie einem Zeiger eines beliebigen Datentyps den Zeiger void* zuweisen. Und ebenso können Sie einen NULL-Zeiger (da für gewöhnlich als (void*)0 definiert) jedem anderen Zeiger zuweisen. Zeiger mit unterschiedlichen Datentypen dürfen allerdings nicht einander zugewiesen werden!