it-praxisportal/courses/cpp/02_pointer_und_speicheradressen/README.md

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 + 1 springt um 4 Bytes (sizeof(int)) weiter.
  • double* ptr: ptr + 1 springt um 8 Bytes (sizeof(double)) weiter.
  • char* ptr: ptr + 1 springt um 1 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

  1. TODO 1 (tausche_werte): Vertausche die Werte zweier int-Variablen an den Adressen a und b. Prüfe auf NULL.
  2. TODO 2 (multipliziere_und_addiere): Berechne Produkt und Summe zweier Ganzzahlen und schreibe sie in die Zeiger prod und sum.
  3. TODO 3 (finde_max_und_min): Finde das Minimum und Maximum in einem Array über Pointerzugriff.
  4. TODO 4 (pointer_schrittweite): Gib die Schrittweite eines Zeigertyps in Bytes zurück (1 -> sizeof(char), 2 -> sizeof(int), 3 -> sizeof(double)).
  5. 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.