Zeiger & Speicher Unit 1 von 3 Theorie + Übungen Dauer: ~45 Min.
Ömer
Ömer sagt:

Pointer sind das mächtigste – und gefährlichste – Konzept in C. Ein Pointer speichert nicht einen Wert, sondern die Adresse einer Variable im Speicher. Damit kannst du Variablen aus jeder Funktion heraus verändern! 🎯

Was ist eine Adresse? Pointer deklarieren * Adressoperator & Dereferenzierung * Pointer in Funktionen

🗺️ Adressen und Pointer

Jede Variable hat eine Adresse im Arbeitsspeicher. Ein Pointer ist eine Variable, die diese Adresse speichert:

int x = 42; – Adresse und Wert
Variable x
42
Adresse: 0x1A2B
Pointer ptr
0x1A2B
Adresse: 0x2C3D
ptr = &x; → ptr enthält die Adresse von x
*ptr = 42 → Wert an der Adresse (Dereferenzierung)

📝 Pointer-Syntax

pointer_basics.cC
#include <stdio.h>
int main() {
    int  x   = 42;       // normale Variable
    int *ptr = &x;       // Pointer auf x (&x = Adresse von x)

    printf("Wert von x:    %d\n",  x);    // 42
    printf("Adresse von x: %p\n",  &x);   // 0x... (hex)
    printf("Wert in ptr:   %p\n",  ptr);  // gleiche Adresse
    printf("*ptr:          %d\n", *ptr);  // 42 (Dereferenzierung)

    *ptr = 100;              // x wird geändert über Pointer!
    printf("x nach *ptr=100: %d\n", x);  // 100
    return 0;
}

⚙️ Pointer in Funktionen – call by reference

Mit Pointern kann eine Funktion Variablen des Aufrufers wirklich verändern:

swap.cC
void tausche(int *a, int *b) {
    int tmp = *a;
    *a       = *b;
    *b       = tmp;
}

int main() {
    int x = 5, y = 9;
    tausche(&x, &y);   // Adressen übergeben!
    printf("x=%d, y=%d\n", x, y); // x=9, y=5
}
▶ Ausgabe
x=9, y=5

📋 Operator-Übersicht

OperatorNameBedeutungBeispiel
&AdressoperatorGibt die Adresse einer Variable&x → Adresse von x
* (Deklaration)Pointer-TypDeklariert einen Pointerint *p
* (Zugriff)DereferenzierungWert an der gespeicherten Adresse*p → Wert von p

⚠️ Uninitialisierter Pointer = Gefahr!

Ein Pointer ohne Initialisierung zeigt auf eine zufällige Adresse. Zugriff darauf ist undefiniertes Verhalten (Absturz). Immer initialisieren: int *p = NULL; oder int *p = &x;

✏️ Übungen

Übung 1

Pointer lesen

Was gibt dieser Code aus? Erkläre jeden Schritt:

int a = 10;
int *p = &a;
*p = 20;
printf("%d\n", a);

Ausgabe:

Erklärung:

Übung 2

Call by Reference

Schreibe eine Funktion verdoppele(int *n), die den Wert der übergebenen Variable verdoppelt:

#include <stdio.h> void verdoppele(int *n) { *n = ___; } int main() { int x = 7; verdoppele(___); printf("x = %d\n", x); // Soll 14 ausgeben return 0; }
Übung 3 – Programm

Min und Max mit Pointern

Schreibe eine Funktion, die den Minimum- und Maximum-Wert eines Arrays über Pointer zurückgibt:

#include <stdio.h> void min_max(int arr[], int n, int *min, int *max) { *min = arr[0]; *max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < *min) *min = arr[i]; if (arr[i] > *max) *max = arr[i]; } } int main() { int zahlen[] = {5, 2, 8, 1, 9, 3}; int mi, ma; min_max(zahlen, 6, ___, ___); printf("Min: %d, Max: %d\n", mi, ma); return 0; }
Übung 4 – Bonus

Swap – zwei Variablen tauschen

Das klassische Pointer-Problem: Schreibe eine Funktion swap(int *a, int *b), die den Inhalt zweier Variablen tauscht. Ohne Pointer wäre das unmöglich!

#include <stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 10, y = 20; printf("Vorher: x=%d, y=%d\n", x, y); swap(&x, &y); printf("Nachher: x=%d, y=%d\n", x, y); /* Bonus: Array mit swap sortieren (Selection Sort) */ int arr[] = {5, 3, 8, 1, 9, 2}; int n = 6; for (int i = 0; i < n - 1; i++) { int min_idx = i; for (int j = i + 1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; swap(&arr[i], &arr[min_idx]); } printf("Sortiert: "); for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); return 0; }
swap() ohne Pointer: Die Funktion würde nur lokale Kopien tauschen – die Originale bleiben unberührt. Mit Pointern änderst du direkt den Speicher der Originale!