
structs sind benutzerdefinierte Datentypen – du kombinierst verschiedene Typen zu einem neuen. Eine Person hat Namen, Alter, Note – alles zusammen in einem struct Schueler!
struct – eigene Datentypen
typedef struct { char name[30]; int alter; float schnitt; } Schueler; Schueler s = {"Oemer", 17, 1.8f}; printf("%s Ø%.1f\n", s.name, s.schnitt);
Zugriff mit dem Punkt-Operator (.)
variable.member – z.B. s.name, s.alter, s.schnitt
Array von structs
Schueler klasse[3] = {{"Anna",16,2.3f},{{"Max",17,1.5f},...}; for(int i=0;i<3;i++) printf("%s\n", klasse[i].name);
typedef – kürzere Schreibweise
Ohne typedef muss man das Schlüsselwort struct bei jeder Variablendeklaration wiederholen. Mit typedef erstellt man einen Alias-Namen – kürzer und lesbarer.
// Ohne typedef: struct Punkt { int x; int y; }; struct Punkt p1; // struct muss immer dastehen // Mit typedef: typedef struct { int x; int y; } Punkt; Punkt p2; // kürzer!
typedef ist Standard in C-Projekten
Fast alle professionellen C-Codebasen verwenden typedef struct. Der selbst gewählte Name (z.B. Punkt, Schueler, Kontakt) macht den Code selbsterklärend.
Struct-Member – Zugriff und Kopieren
Auf Struct-Member greift man mit dem Punkt-Operator . zu. Bei einem Pointer auf ein Struct verwendet man den Pfeil-Operator -> (Vorschau auf spätere Units). Anders als Arrays können Structs direkt mit = kopiert werden!
Punkt a = {3, 4}; Punkt b = a; // vollständige Kopie – funktioniert! b.x = 10; // ändert nur b, nicht a! printf("a.x=%d b.x=%d\n", a.x, b.x);
| Operator | Verwendung | Beispiel |
|---|---|---|
| . | Direkte Struct-Variable | p.x, s.name |
| -> | Pointer auf Struct | ptr->x (= (*ptr).x) |
| = | Vollständige Struct-Kopie | Punkt b = a; |
Structs an Funktionen übergeben
Structs können wie einfache Typen an Funktionen übergeben werden – entweder als Wert (Kopie) oder als Pointer (effizient, Original veränderbar).
// By value: sichere Kopie, Original unberührt void zeige(Punkt p) { printf("(%d,%d)\n", p.x, p.y); } // By pointer: effizient, kann Original verändern void verschiebe(Punkt *p, int dx, int dy) { p->x += dx; // -> statt . bei Pointer p->y += dy; }
By value vs. by pointer
Bei kleinen Structs (2–3 Felder) ist by value gut. Bei großen Structs (viele Felder, z.B. 10+ Mitglieder) ist by pointer effizienter, da keine vollständige Kopie erzeugt wird. Als Faustregel: wenn die Funktion das Original verändern soll, immer Pointer verwenden.
Häufige Fehler
| Fehler | Problem | Richtig |
|---|---|---|
p.mitglied statt p->mitglied | Compilerfehler bei Pointer auf Struct | ptr->x oder (*ptr).x |
| struct Punkt p ohne typedef | Ohne typedef muss struct immer dabei stehen | typedef struct {...} Punkt; verwenden |
| Große Struct by value | Jedes Mal eine teure vollständige Kopie | Pointer übergeben: void f(Punkt *p) |
⚡ 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 29
- Ich kann ein struct mit typedef definieren
- Ich greife mit . auf struct-Mitglieder zu
- Ich kann Arrays von structs erstellen und durchlaufen
- Ich verstehe warum structs wichtig für Datenmodellierung sind