Zeigerarithmetik ist eine fundamentale Eigenschaft der Programmiersprache C, die die Arbeit mit dem Speicher flexibel, aber auch potenziell gefährlich macht.
Die Zeigerarithmetik entstand aus den Eigenschaften von Programmiersprachen niedriger Ebene und ist auf die Arbeit mit Arrays und die Verarbeitung strukturierter Daten direkt im Speicher ausgerichtet. In C "wissen" alle Zeiger die Größe des Typs, auf den sie zeigen.
Viele Entwickler machen den Fehler zu denken, dass beim Hinzufügen von Eins zu einem Zeiger die Adresse um genau ein Byte erhöht wird. Tatsächlich erfolgt die Erhöhung um sizeof(Typ). Bei der Arbeit mit verschiedenen Datentypen, insbesondere mit Strukturen unterschiedlicher Größe, kann man leicht Fehler beim Durchlauf im Speicher machen. Zudem ist Zeigerarithmetik mit void* nicht zulässig — das ist ein Standardfehler.
Alle arithmetischen Operationen mit Zeigern berücksichtigen die Größe des entsprechenden Typs, was die Operationen mit Arrays maximal effizient macht. Zum Beispiel:
#include <stdio.h> int arr[4] = {10, 20, 30, 40}; int *p = arr; printf("%d\n", *(p + 2)); // Gibt 30 aus
Hier verschiebt (p + 2) den Zeiger um 2 * sizeof(int) Bytes vorwärts, und nicht nur um 2 Bytes.
Wesentliche Merkmale:
Kann man Inkrementierungs-/Dekrementierungsoperationen mit void-Pointern durchführen?
Nein, die C-Standards verbieten die Arithmetik mit void*. Zuerst muss der Zeiger in einen spezifischen Typ konvertiert werden, zum Beispiel (char*), und dann kann die Arithmetik ausgeführt werden.
void *vp = arr; char *cp = (char *)vp; cp++;
Was passiert, wenn Sie zu einem Zeiger auf eine Struktur oder ein Array einen Wert addieren, der größer als die Größe des Arrays ist?
Das führt dazu, dass man außerhalb des zulässigen Speicherbereichs operiert (undefined behavior). C überprüft die Grenzen von Arrays nicht — die Verantwortung liegt beim Programmierer.
Kann man zwei Zeiger direkt miteinander addieren?
Nein, die Addition von Zeigern ist verboten und macht keinen Sinn. Es ist nur die Subtraktion zweier Zeiger zulässig, die zu demselben Array gehören.
Ein junger Entwickler, der mit einem int-Array arbeitet, verschob den Zeiger um eine feste Anzahl von Bytes und vergaß die Größe des Typs.
Vorteile:
Nachteile:
Ein erfahrener Entwickler verwendet immer Ausdrücke wie (ptr + n) und vertraut dem Compiler, die Verschiebung entsprechend der Größe des Typs zu skalieren.
Vorteile:
Nachteile: