EMZETT.
Login

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