Arrays ·
Pointer ·
Speicher ·
Zeigerarithmetik ·
Strings ·
Mehrdim. Arrays
Arrays und Zeiger sind zentrale Konzepte in C. Sie ermöglichen effiziente Speicherverwaltung und direkten Zugriff auf den Arbeitsspeicher – die Grundlage für systemnahe Programmierung.
Arrays speichern mehrere Werte des gleichen Typs in zusammenhängendem Speicher. Der Zugriff erfolgt über den Index (0-basiert). Die Größe muss zur Compile-Zeit bekannt sein.
| Konzept | Beschreibung |
|---|---|
| int arr[10] | Array mit 10 Elementen |
| int arr[] = {1, 2, 3} | Initialisierung ohne Größenangabe |
| arr[0] | Erstes Element (Index 0) |
| sizeof(arr) | Gesamtgröße in Bytes |
| sizeof(arr) / sizeof(arr[0]) | Anzahl der Elemente |
| arr | Name des Arrays = Zeiger auf erstes Element |
arr und &arr[0] sind äquivalent.
Pointer (Zeiger) speichern die Speicheradresse einer Variable. Sie ermöglichen direkten Zugriff auf den Speicher, dynamische Allokation und effiziente Parameterübergabe.
| Konzept | Beschreibung |
|---|---|
| &variable | Adressoperator – liefert die Adresse einer Variable |
| *pointer | Dereferenzierungsoperator – Zugriff auf den Wert an der Adresse |
| int *p | Pointer auf int |
| NULL | Nullzeiger (zeigt auf nichts) |
| void * | Typenloser Pointer (für beliebige Datentypen) |
| int **p | Pointer auf Pointer (mehrfache Indirektion) |
NULL-Pointer oder einen uninitialisierten Pointer – das führt zu einem Segmentation Fault (Programmabsturz).
Dynamische Speicherallokation ermöglicht die Reservierung von Speicher zur Laufzeit. malloc, calloc und realloc reservieren Speicher auf dem Heap, free gibt ihn frei.
| Funktion | Beschreibung |
|---|---|
| malloc(bytes) | Reserviert bytes Bytes (nicht initialisiert) |
| calloc(n, size) | Reserviert n Elemente à size Bytes (initialisiert mit 0) |
| realloc(ptr, bytes) | Ändert die Größe des reservierten Speichers |
| free(ptr) | Gibt reservierten Speicher frei |
malloc/calloc/realloc muss mit free freigegeben werden – sonst entsteht ein Speicherleck (memory leak).
Zeigerarithmetik ermöglicht das Navigieren durch Arrays durch Addition/Subtraktion von Ganzzahlen. Die Schrittweite entspricht der Größe des Zeigertyps (sizeof(T)).
| Operation | Beschreibung |
|---|---|
| p++ / ++p | Inkrementiert den Zeiger (nächstes Element) |
| p-- / --p | Dekrementiert den Zeiger (vorheriges Element) |
| p + n | Zeiger + n Elemente |
| p - q | Differenz zweier Zeiger (Anzahl Elemente) |
| p < q | Vergleich von Zeigeradressen |
*(p + i) ist äquivalent zu p[i].
Strings in C sind Arrays vom Typ char, die mit einem Nullzeichen '\0' abgeschlossen werden. Die string.h-Bibliothek bietet viele Hilfsfunktionen.
| Funktion | Beschreibung |
|---|---|
| strlen(s) | Länge des Strings (ohne '\0') |
| strcpy(dest, src) | Kopiert src nach dest |
| strncpy(dest, src, n) | Kopiert max. n Zeichen |
| strcat(dest, src) | Hängt src an dest an |
| strcmp(s1, s2) | Vergleicht zwei Strings (0 = gleich) |
| strncmp(s1, s2, n) | Vergleicht max. n Zeichen |
| strchr(s, c) | Sucht erstes Vorkommen von c |
| strstr(s, sub) | Sucht Teilstring sub |
strcpy und strcat können zu Pufferüberläufen führen – verwenden Sie strncpy und strncat für mehr Sicherheit.
Mehrdimensionale Arrays speichern Daten in Tabellenform. Sie werden als "Array von Arrays" realisiert und sind im Speicher zeilenweise angeordnet.
int arr[M][N] kann als int (*ptr)[N] übergeben werden – der Zeiger zeigt auf ein Array von N ints.
int a[5]
int *p
malloc()
p++
char s[]
int m[2][3]
int arr[] = {1,2,3}; int *p = arr; p++; printf("%d", *p);