Fortgeschrittene Algorithmen und Programmierung in C
Wie arbeitet man mit mehreren Strukturen und übergibt sie an Funktionen?
structHeute: Mehrere Strukturen verwalten und an Funktionen übergeben!
Jedes Array-Element ist eine komplette Struktur!
Visualisierung im Speicher:
Syntax: Jede Person in eigenen { }, alle zusammen in äußeren { }
Mit Daten gefüllt:
arrayName[index].komponenteSchritt für Schritt:
klasse[0] → Erste Person
.name → Name dieser Person
.alter → Alter dieser Person
Schleifendurchlauf:
scanf("%s", klasse[i].name)
Strings sind bereits Adressen!
scanf("%d", &klasse[i].alter)
int/double brauchen &
Kopie wird übergeben
Original bleibt unverändert
Adresse wird übergeben
Original kann geändert werden
Was passiert:
Visualisierung:
Änderung verloren!
Problem: Call by Value ändert nur die Kopie, nicht das Original!
Warum "ptr"?
Kurz für "pointer" (Zeiger). Konvention: Zeiger-Variablen heißen oft ptr, p, oder pPerson.
Speicherbild:
Warum ist -> besser?
Klammern nötig wegen Priorität!
Pfeil-Operator = Standard!
ptr->alter ist identisch mit (*ptr).alter
| Situation | Operator | Beispiel |
|---|---|---|
| Normale Struktur-Variable | Punkt (.) |
p1.alter = 25; |
| Zeiger auf Struktur | Pfeil (->) |
ptr->alter = 25; |
Direkte Variable:
Über Zeiger:
Visualisierung:
&p1 übergibt Adresse
p->alter ändert Original!
Ablauf:
[] übergebenAblauf:
Praktisch für "Konstruktor"-Funktionen!
| Aspekt | Call by Value | Call by Reference |
|---|---|---|
| Übergeben wird | Komplette Kopie | Nur Adresse (8 Bytes) |
| Bei 100 Bytes Struktur | 100 Bytes kopiert | 8 Bytes kopiert |
| Original änderbar? | Nein | Ja |
| Geschwindigkeit | Langsamer bei großen Structs | Immer schnell |
Bei Strukturen mit mehr als 3-4 Komponenten: Call by Reference verwenden!
Berechnung:
Berechnung:
| Apfel | 0.50€ × 5 | = 2.50€ |
| Brot | 2.50€ × 2 | = 5.00€ |
| Milch | 1.20€ × 3 | = 3.60€ |
| Summe: | = 11.10€ | |
Suchvorgang nach "Ben":
Intern: Rückgabe &arr[1]
Merke: Zeiger → Pfeil (->), Variable → Punkt (.)
Damit alle Funktionen sie kennen
Bei großen Strukturen immer
ptr->x statt (*ptr).x
struct Student statt struct S
Niemals = für char[]
Immer als extra Parameter
Erstellen Sie eine Struktur Buch mit: titel (String), autor (String), seiten (int).
Erwartete Ausgabe:
Struktur Produkt mit: name (String), preis (double).
erhoehe_preisFunktionskopf:
void erhoehe_preis(struct Produkt *p, double prozent)
Beispielaufruf:
erhoehe_preis(&laptop, 10.0);
// Erhöht um 10%
Wichtig: Durch &laptop wird die Adresse übergeben. Die Funktion ändert das Original!
Struktur Student mit: name (String), matrikelnr (int), note (double).
Funktionsprototyp:
struct Person arr[n];arr[i].namestruct Person *ptr = &p;ptr->alter
Üben Sie mit den drei Übungsaufgaben.
Kombinieren Sie Arrays, Funktionen und Zeiger!
Nächste Vorlesung: Rekursion
Fortgeschrittene Algorithmen und Programmierung in C