
Arrays und Pointer – in C sind sie das gleiche! Der Array-Name ist ein Pointer auf das erste Element. arr[i] und *(arr+i) sind identisch!
Array-Name ist Pointer
int a[] = {10,20,30}; int *p = a; // kein &! printf("%d %d\n", a[1], *(a+1)); // 20 20 printf("%d %d\n", p[2], *(p+2)); // 30 30
arr[i] ≡ *(arr+i)
Der Compiler übersetzt beide Schreibweisen identisch. arr[i] ist lesbarer, *(arr+i) zeigt was wirklich passiert.
Warum Arrays ohne & übergeben werden
Weil der Array-Name bereits ein Pointer ist: f(arr) übergibt die Adresse des ersten Elements – kein & nötig und keine Kopie!
Pointer-Arithmetik im Detail
Wenn du einen Pointer um 1 erhöhst (p++), springt er nicht 1 Byte weiter, sondern genau sizeof(Typ) Bytes – also zum nächsten Element im Array.
| Typ | sizeof | p++ springt um |
|---|---|---|
| int *p | 4 Bytes | 4 Bytes weiter |
| char *p | 1 Byte | 1 Byte weiter |
| double *p | 8 Bytes | 8 Bytes weiter |
int arr[] = {10, 20, 30, 40}; int *p = arr; while (p < arr + 4) { printf("%d ", *p); p++; } // Output: 10 20 30 40
Typ bestimmt die Schrittweite
Der Compiler berechnet automatisch die richtige Byte-Anzahl pro Schritt – basierend auf dem deklarierten Zeigertyp. Deshalb ist der Typ bei Pointern so wichtig!
arr[i] ist dasselbe wie *(arr+i)
Der Compiler übersetzt arr[i] intern immer zu *(arr+i). Beide Schreibweisen sind exakt identisch – das ist keine Vereinfachung, sondern die tatsächliche C-Semantik.
int a[] = {5, 10, 15}; printf("%d\n", a[2]); // 15 printf("%d\n", *(a + 2)); // 15 – identisch! printf("%d\n", 2[a]); // 15 – auch gültig aber nicht empfohlen!
2[a] – warum funktioniert das?
Weil a[2] zu *(a+2) wird und Addition kommutativ ist: *(a+2) == *(2+a) == 2[a]. Technisch korrekt, aber nie in echtem Code verwenden – verwirrend!
Häufige Fehler
Array-Name ist unveränderlicher Pointer
arr++ funktioniert nicht! Der Array-Name ist ein konstanter Pointer – er zeigt immer auf das erste Element und kann nicht verschoben werden. Nur ein int *p = arr; und dann p++ ist erlaubt.
| Fehler | Problem | Richtig |
|---|---|---|
| arr++ | Array-Name ist kein veränderbarer Pointer | int *p = arr; p++; |
| *(arr + 10) bei arr[5] | Lesen nach Array-Ende → Undefined Behavior | Index < Größe prüfen |
| sizeof(p) in Funktion | Gibt Pointer-Größe (4 oder 8), nicht Array-Größe | Größe als Parameter übergeben |
sizeof-Falle in Funktionen
In einer Funktion void f(int *arr) liefert sizeof(arr) immer 4 oder 8 (Pointer-Größe), nie die Array-Größe. Das Array "zerfällt" beim Übergeben zum Pointer – die Größeninformation geht verloren. Lösung: Größe als zweiten Parameter int n übergeben.
⚡ Code-Simulator
Teste den Code direkt im Browser – printf-Ausgaben werden simuliert:

Experimentiere mit dem Code – das ist der beste Weg um Pointer und structs wirklich zu verstehen!
🎯 Wissens-Quiz
📋 Spickzettel
✅ Checkliste Unit 27
- Ich weiß dass Array-Name = Pointer ist
- Ich kenne den Zusammenhang arr[i] = *(arr+i)
- Ich verstehe warum Arrays ohne & übergeben werden
- Ich kann Pointer-Arithmetik anwenden