Zeigergrundlagen
Was ist ein Zeiger?
In der C-Programmierung ist ein Zeiger eine Variable, die die Speicheradresse einer anderen Variablen speichert. Im Gegensatz zu normalen Variablen, die direkt Daten enthalten, bieten Zeiger eine Möglichkeit, indirekt auf den Speicher zuzugreifen und ihn zu manipulieren.
graph LR
A[Variable] --> B[Speicheradresse]
B --> C[Zeiger]
Deklaration und Initialisierung von Zeigern
Zeiger werden mit einem Sternchen (*) gefolgt vom Zeigernamen deklariert:
int *ptr; // Zeiger auf eine ganze Zahl
char *charPtr; // Zeiger auf einen Charakter
double *doublePtr; // Zeiger auf eine Gleitkommazahl vom Typ double
Adressenoperator (&) und Dereferenzierungsoperator (*)
Speicheradresse erhalten
int x = 10;
int *ptr = &x; // ptr enthält nun die Speicheradresse von x
Dereferenzierung eines Zeigers
int x = 10;
int *ptr = &x;
printf("Wert von x: %d\n", *ptr); // Zugriff auf den Wert an der Adresse
Zeigertypen und Speicherallokation
Zeigertyp |
Größe (auf 64-bit Systemen) |
Beschreibung |
char* |
8 Byte |
Speichert die Adresse eines Zeichens |
int* |
8 Byte |
Speichert die Adresse einer ganzen Zahl |
double* |
8 Byte |
Speichert die Adresse einer Gleitkommazahl vom Typ double |
Gängige Zeigeroperationen
Zeigerarithmetik
int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr; // Zeigt auf das erste Element
printf("%d\n", *ptr); // 10
printf("%d\n", *(ptr + 1)); // 20
printf("%d\n", *(ptr + 2)); // 30
Nullzeiger
int *ptr = NULL; // Immer initialisieren Sie nicht zugewiesene Zeiger auf NULL
Mögliche Fallstricke
- Nicht initialisierte Zeiger
- Dereferenzierung von Nullzeigern
- Speicherlecks
- Pufferüberläufe
Best Practices
- Initialisieren Sie Zeiger immer.
- Überprüfen Sie vor der Dereferenzierung auf NULL.
- Verwenden Sie dynamische Speicherallokation sorgfältig.
- Geben Sie dynamisch allozierten Speicher frei.
Beispiel: Praktische Zeigerverwendung
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("Vor dem Tausch: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("Nach dem Tausch: x = %d, y = %d\n", x, y);
return 0;
}
Lernen mit LabEx
Um die Konzepte von Zeigern zu üben und zu meistern, bietet LabEx interaktive C-Programmierumgebungen, in denen Sie sicher mit Zeigeroperationen experimentieren können.