2.5 KiB
2.5 KiB
C 02: Pointer, Speicheradressen & Zeigerarithmetik 🧠
Willkommen zu Modul 02 des C & C++ Systems Lehrpfads!
In diesem Modul meisterst du das absolute Kernkonzept hardwarenaher Programmierung: Pointer (Zeiger). Du lernst, wie der physische Arbeitsspeicher adressiert wird, wie du Daten über Speicheradressen liest und modifizierst, wie Zeigerarithmetik funktioniert und wie C Pass-by-Reference realisiert.
💡 1. Das Wichtigste in Kürze
Die zwei magischen Operatoren: & und *
- Adressoperator
&(Referenzieren): Gibt die Speicheradresse einer Variablen zurück (z. B.&x). - Dereferenzierungsoperator
*(Indirektion): Greift auf den Wert an der im Zeiger gespeicherten Adresse zu (z. B.*ptr = 100;).
int count = 10;
int* pCount = &count; // pCount zeigt auf die Adresse von count
printf("Wert von count: %d\n", count); // 10
printf("Adresse von count: %p\n", (void*)pCount); // z.B. 0x7ffd54a0
printf("Dereferenzierter Wert: %d\n", *pCount); // 10
*pCount = 25; // Ändert den Wert von count auf 25!
Zeigerarithmetik (Pointer Arithmetic)
In C skaliert die Zeigerarithmetik automatisch mit dem zugrundeliegenden Datentyp T:
int* ptr:ptr + 1springt um4 Bytes(sizeof(int)) weiter.double* ptr:ptr + 1springt um8 Bytes(sizeof(double)) weiter.char* ptr:ptr + 1springt um1 Byte(sizeof(char)) weiter.
Pass-by-Reference in C
C kennt ausschließlich Pass-by-Value (Kopieren von Werten beim Funktionsaufruf). Um den Originalwert in der aufrufenden Funktion zu verändern oder mehrere Werte zurückzugeben, übergibt man Zeiger auf die Variablen:
void reset(int* p) {
if (p != NULL) {
*p = 0;
}
}
🎯 Aufgaben in aufgabe.c
- TODO 1 (
tausche_werte): Vertausche die Werte zweierint-Variablen an den Adressenaundb. Prüfe aufNULL. - TODO 2 (
multipliziere_und_addiere): Berechne Produkt und Summe zweier Ganzzahlen und schreibe sie in die Zeigerprodundsum. - TODO 3 (
finde_max_und_min): Finde das Minimum und Maximum in einem Array über Pointerzugriff. - TODO 4 (
pointer_schrittweite): Gib die Schrittweite eines Zeigertyps in Bytes zurück (1 -> sizeof(char),2 -> sizeof(int),3 -> sizeof(double)). - TODO 5 (
array_summe_zeigerarithmetik): Berechne die Summe eines Arrays ausschließlich über Zeiger-Inkrementierung (const int* ptr = start; ptr < start + count; ptr++).
🧪 Tests ausführen
Die Tests validieren Speichermanipulation und Zeigerarithmetik auf Byte-Ebene.