Zeiger

Zeiger (Pointers) sind Variablen, die die Adresse einer anderen Variablen speichern. Sie ermöglichen direkte Speicheradressierung, dynamische Speicherverwaltung und sind zentral in C.

1. Definition eines Zeigers

Ein Zeiger ist eine Variable, die die Speicheradresse einer anderen Variablen enthält.
int a = 10;
int *p = &a;  // p speichert die Adresse von a
printf("%p\n", (void*)p);

2. Dereferenzierung

Dereferenzierung bedeutet, den Wert an der Adresse zu lesen oder zu schreiben.
int value = *p; // Wert von a lesen
*p = 20;          // Wert von a ändern

3. Zeigerarithmetik

Zeiger können inkrementiert oder dekrementiert werden, um durch Arrays zu iterieren.
int arr[3] = {1,2,3};
int *ptr = arr; // Zeiger auf erstes Element

printf("%d\n", *ptr);   // 1
ptr++;                  // nächstes Element
printf("%d\n", *ptr);   // 2

4. Zeiger und Arrays

Arrays werden oft über Zeiger adressiert, da der Arrayname wie ein Zeiger auf das erste Element wirkt.
int arr[5] = {10,20,30,40,50};
int *p = arr;

for(int i=0; i<5; i++) {
    printf("%d ", *(p+i));
}

5. Zeiger auf Zeiger

Ein Zeiger auf Zeiger speichert die Adresse eines Zeigers.
int a = 5;
int *p = &a;
int **pp = &p;

printf("%d\n", **pp); // 5

6. Funktionsparameter als Zeiger

Zeiger ermöglichen Call by Reference, um Werte in Funktionen zu ändern.
void increment(int *x) {
    (*x)++;
}

int main(void) {
    int a = 10;
    increment(&a);
    printf("%d\n", a); // 11
    return 0;
}

7. Zusammenfassung