📘 Kapitel 6 · Zeiger & Speicher

Einführung in
Pointer

* · & · Dereferenzierung · Call by Reference

26 / 30 Units
Ömer
Unit 26 von 30 ~45 Min. Theorie + Simulator + Quiz + Spickzettel
Ömer
Ömer sagt:

Pointer sind das mächtigste Werkzeug in C. Mit & bekommst du die Adresse, mit * greifst du auf den Wert zu – und eine Funktion kann damit Variablen des Aufrufers wirklich verändern!

Pointer – Grundkonzept

OperatorNameBedeutungBeispiel
&AdressoperatorAdresse einer Variable&x
* (Deklaration)Pointer-TypDeklariert Pointerint *p;
* (Zugriff)DereferenzierungWert an der Adresse*p
pointer.cC
int  x   = 42;
int *p   = &x;    // p zeigt auf x
printf("%d\n", *p); // 42
*p = 100;            // x ist jetzt 100!
printf("%d\n", x);  // 100

Call by Reference mit Pointern

Mit Pointern kann eine Funktion die Original-Variable ändern:
void f(int *n) {{ *n = *n * 2; }}
f(&x); → x wird verdoppelt

Visualisierung im Speicher

Ein Pointer ist selbst eine Variable, die eine Adresse als Wert speichert. Die folgende Tabelle zeigt wie Variablen und Pointer im Speicher aussehen (Adressen vereinfacht):

VariableAdresseWert
int x = 420x7fff000142
int *p = &x0x7fff00020x7fff0001 (zeigt auf x)
*p42 (Wert, auf den p zeigt)

Adressen sind vereinfachte Beispiele

Echte Speicheradressen sehen aus wie 0x7ffee4b3c8a0. Die genaue Adresse hängt vom Betriebssystem und Laufzeitumgebung ab. Wichtig ist das Prinzip: p speichert die Adresse von x, *p liefert den Wert an dieser Adresse.

Pointer-Arithmetik

Bei Pointer-Arithmetik addiert C nicht einfach 1 Byte, sondern 1 × sizeof(Typ). Bei einem int* springt p+1 also um 4 Bytes weiter, bei einem char* um 1 Byte.

Typp+1 bedeutetSprung in Bytes
int *pnächste int-Variable+4 Bytes
char *pnächstes Zeichen+1 Byte
double *pnächste double-Variable+8 Bytes
pointer_arithmetik.cC
int arr[3] = {10, 20, 30};
int *p = arr;               // p zeigt auf arr[0]
printf("%d\n", *p);          // 10
printf("%d\n", *(p+1));      // 20  (= arr[1])
printf("%d\n", *(p+2));      // 30  (= arr[2])
// arr[i] und *(arr+i) sind identisch!
▶ Ausgabe
10 20 30

NULL-Pointer

Ein Pointer sollte immer initialisiert werden. Wenn er noch auf nichts zeigt, verwendet man NULL als sicheren Anfangswert.

null_pointer.cC
int *p = NULL;        // sicherer Anfangswert

if (p != NULL) {       // immer prüfen vor Zugriff!
    printf("%d\n", *p);
} else {
    printf("Pointer ist NULL!\n");
}

// Zugriff auf NULL ohne Prüfung:
// *p = 5;  →  Segmentation Fault (Absturz)!
▶ Ausgabe
Pointer ist NULL!
SituationVerhalten
int *p = NULL;Sicher – p zeigt auf nichts, klar definiert
if (p != NULL)Pflicht vor jedem Zugriff via Pointer
*p wenn p == NULLSegmentation Fault – Programmabsturz

Häufige Fehler

FehlerProblemLösung
int *p; *p = 5;Uninitialisierter Pointer zeigt auf zufällige Adresse – undefiniertes Verhalten!Immer initialisieren: int *p = NULL; oder int *p = &x;
& und * verwechseln& = Adresse von, * = Wert an der AdresseMerkhilfe: & = "Adresse-von", * = "Wert-an"
Dangling PointerPointer nach free(p) weiter verwenden – zeigt auf freigegebenen SpeicherNach free(p) sofort p = NULL; setzen

⚠️ Uninitialisierte Pointer sind extrem gefährlich!

Ein Pointer ohne Initialisierung enthält eine zufällige Adresse aus dem Speicher. Ein Zugriff darauf kann Daten überschreiben, Abstürze verursachen oder – noch schlimmer – still falsche Ergebnisse liefern. Immer mit NULL oder einer gültigen Adresse initialisieren!

⚡ Code-Simulator

Teste den Code direkt im Browser – printf-Ausgaben werden simuliert:

C Simulator – Unit 26
▶ Ausgabe
– Klicke AUSFÜHREN –
Ömer
Ömer sagt:

Experimentiere mit dem Code – das ist der beste Weg um Pointer und structs wirklich zu verstehen!

🎯 Wissens-Quiz

Frage 1
Was speichert ein Pointer?
AEinen Wert
BEine Adresse im Speicher
CDen Typ einer Variable
DNichts
Frage 2
Was macht der &-Operator?
AVergleicht zwei Werte
BGibt die Adresse einer Variable
CDereferenziert einen Pointer
DDeklariert einen Pointer
Frage 3
Was bedeutet *p bei einem Pointer p?
Ap multipliziert mit p
BAdresse von p
CWert an der Adresse von p
DTyp von p
Frage 4
Wie übergibt man eine Variable per Referenz?
Af(x)
Bf(*x)
Cf(&x)
Df(&*x)
Frage 5
Was ist ein NULL-Pointer?
AEin Pointer auf 0
BEin Pointer auf keine gültige Adresse
CEin Pointer auf einen int
DEin leerer Array
Frage 6
Was passiert bei Zugriff auf einen NULL-Pointer?
AEs wird 0 zurückgegeben
BDer Compiler meldet einen Fehler
CSegmentation Fault (Absturz)
DDer Pointer wird automatisch initialisiert
Frage 7
Was ist Pointer-Arithmetik?
Ap+1 zeigt auf das nächste Element des Typs (nicht +1 Byte)
Bp+1 addiert 1 zum gespeicherten Wert
CPointer können nicht addiert werden
Dp+1 gibt die Adresse plus 1 Byte zurück
Frage 8
Was ist ein "dangling pointer"?
AEin nicht initialisierter Pointer
BEin Pointer auf NULL
CEin Pointer der auf ein Array zeigt
DPointer der auf freigegebenen Speicher zeigt (nach free())

📋 Spickzettel

Pointer-Syntax
int *p;Pointer deklarieren
p = &x;Adresse von x
*pWert an der Adresse
*p = 5;Wert ändern
Tipps
NULL-Initint *p = NULL;
Call by Refvoid f(int *p)
&x beim Aufruff(&x);
Immer prüfenif(p != NULL)

✅ Checkliste Unit 26

  • Ich kann einen Pointer deklarieren und initialisieren
  • Ich kenne & (Adresse) und * (Dereferenzierung)
  • Ich kann Call by Reference mit Pointern implementieren
  • Ich weiß was ein NULL-Pointer ist