Zeiger (Pointer)
Kurz: Ein Zeiger ist eine Variable, die nicht den Wert selbst, sondern die Speicheradresse eines Werts enthält. Über den Zeiger kann man indirekt auf die Daten zugreifen.
Genauer: Zeiger sind in C, C++, Pascal, Go, Rust und Assembler zentral. Sie ermöglichen dynamische Datenstrukturen (verkettete Listen, Bäume), das Übergeben großer Daten ohne Kopie und direkten Hardwarezugriff. In Java, Python oder JavaScript gibt es sie nicht sichtbar, doch dort sind Objektvariablen im Kern Referenzen.
Im Detail
#include <stdio.h>
int main(void) {
int zahl = 42;
int *p = &zahl; // p speichert die Adresse von zahl
printf("%d
", *p); // 42 (Dereferenzieren)
*p = 100; // ändert zahl über den Zeiger
printf("%d
", zahl); // 100
int feld[3] = {10, 20, 30};
int *q = feld;
printf("%d
", *(q + 1)); // 20 (Zeigerarithmetik)
return 0;
}Häufige Zeigerfehler
- Nullzeiger: Zugriff auf
NULL→ Absturz (siehe Null). - Hängender Zeiger (dangling): Zeiger auf bereits freigegebenen Speicher.
- Pufferüberlauf: Zugriff über das Ende eines Arrays hinaus – eine Hauptursache von Sicherheitslücken.
- Speicherleck: Speicher wird nie freigegeben (Speicherleck).
- Doppeltes Freigeben (double free).
Sichere Alternativen
C++ bietet Smart Pointer (unique_ptr, shared_ptr), Rust prüft Lebensdauer und Besitz im Typsystem, Go und Java nutzen Garbage Collection (Garbage Collector). Wie Speicher aufgeteilt wird, erklärt Stack und Heap.
Siehe auch: Stack und Heap, Null, Speicherleck, Referenztypen