Zeiger & Speicher Unit 2 von 3 Theorie + Übungen Dauer: ~45 Min.
Ömer
Ömer sagt:

In C sind Arrays und Pointer eng verwandt – der Array-Name ist bereits ein Pointer auf das erste Element! Das erklärt warum du Arrays ohne & übergibst. Und mit Pointer-Arithmetik kannst du durch Arrays navigieren! 🧭

Array-Name = Pointer Pointer-Arithmetik arr[i] vs. *(arr+i) Pointer auf Strings

🔗 Array-Name ist ein Pointer

Der Name eines Arrays ist automatisch ein Pointer auf das erste Element (Index 0):

array_pointer.cC
int arr[] = {10, 20, 30, 40};
int *p   = arr;     // p zeigt auf arr[0]

printf("%d\n", arr[0]);   // 10
printf("%d\n", *arr);     // 10 – gleich!
printf("%d\n", *p);       // 10

/* Äquivalente Zugriffe: */
printf("%d\n", arr[2]);   // 30
printf("%d\n", *(arr+2)); // 30 – gleich!

➕ Pointer-Arithmetik

p + 1 zeigt nicht auf die nächste Speicherzelle, sondern auf das nächste Element des Typs (bei int: +4 Bytes):

int arr[4] im Speicher – Pointer-Arithmetik
10
arr+0
20
arr+1
30
arr+2
40
arr+3
*(arr+0)=10   *(arr+1)=20   *(arr+2)=30   *(arr+3)=40

💡 arr[i] vs *(arr+i)

Beide Schreibweisen sind identisch!

arr[i] ist genau dasselbe wie *(arr + i). Der Compiler übersetzt beide gleich. arr[i] ist die lesbarere Form – bevorzuge sie in normalem Code.

📝 Pointer auf Strings

string_pointer.cC
char *name = "Oemer";  // Pointer auf String-Literal (read-only!)
printf("%s\n", name);   // Oemer
printf("%c\n", *name);  // O (erstes Zeichen)

/* Bessere Alternative für veränderbare Strings: */
char buf[20] = "Oemer";   // Array = veränderbar!

✏️ Übungen

Übung 1

Äquivalenz prüfen

Gegeben: int a[] = {5, 10, 15, 20}; int *p = a;
Welchen Wert haben folgende Ausdrücke?

  1. *p = _______
  2. *(p+2) = _______
  3. a[3] = _______
  4. *(a+1) = _______
Übung 2 – Programm

Array mit Pointer durchlaufen

Schreibe eine Funktion, die ein Array mit Pointer-Arithmetik (nicht mit arr[i]) durchläuft und die Summe berechnet:

#include <stdio.h> int summe(int *p, int n) { int s = 0; for (int i = 0; i < n; i++) { s += *(p + i); // Pointer-Arithmetik } return s; } int main() { int arr[] = {1, 2, 3, 4, 5}; printf("Summe: %d\n", summe(arr, 5)); // 15 return 0; }
Übung 3 – Bonus

Array mit Pointer-Arithmetik umkehren

Kehre ein Array in-place um – ohne ein zweites Array zu brauchen. Nutze zwei Pointer: einen vom Anfang, einen vom Ende, und bewege sie aufeinander zu:

#include <stdio.h> void umkehren(int *start, int *ende) { while (start < ende) { int temp = *start; *start = *ende; *ende = temp; start++; /* Pointer vorwärts */ ende--; /* Pointer rückwärts */ } } void drucke(int *p, int n) { for (int i = 0; i < n; i++) printf("%d ", *(p + i)); printf("\n"); } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7}; int n = 7; printf("Vorher: "); drucke(arr, n); umkehren(arr, arr + n - 1); /* arr+n-1 = letztes Element */ printf("Nachher: "); drucke(arr, n); return 0; }
arr + n - 1 ist Pointer-Arithmetik: arr zeigt auf Element 0, arr+6 zeigt auf Element 6. Kein Index-Operator nötig!