Pointer
Pointer (C)
Ein Pointer (deutsch: *Zeiger*) ist ein spezieller Variablentyp in der Programmiersprache C, der nicht direkt einen Wert, sondern die Speicheradresse einer anderen Variablen speichert. Pointer sind ein zentrales Konzept in C, da sie direkten Zugriff auf den Speicher ermöglichen und in vielen Bereichen wie Arrays, Funktionen, dynamischer Speicherverwaltung und Strukturen verwendet werden.
Grundprinzip
Jede Variable in C wird im Speicher abgelegt. Ein Pointer enthält die Adresse dieses Speicherorts.
Beispiel:
int a = 5;
int* p = &a;
- a ist eine normale Variable vom Typ int mit dem Wert 5
- &a ist die Speicheradresse von a
- p ist ein Pointer, der auf a zeigt
Deklaration
Die Syntax zur Deklaration eines Pointers lautet:
Datentyp* pointer_name;
Beispiele:
int* p; // Zeiger auf int
char* c; // Zeiger auf char
float* f; // Zeiger auf float
Operatoren
C stellt zwei spezielle Operatoren für Pointer bereit:
- & (Adressoperator)
Liefert die Adresse einer Variablen. Beispiel:
int a = 10;
int* p = &a; // p erhält die Adresse von a
- * (Dereferenzierungsoperator)
Greift auf den Wert zu, auf den der Zeiger zeigt. Beispiel:
printf("%d", *p); // gibt den Wert 10 aus
Beispielprogramm
#include <stdio.h>
int main() {
int x = 42;
int* ptr = &x;
printf("Wert von x: %d\n", x);
printf("Adresse von x: %p\n", (void*)&x);
printf("Wert von ptr: %p\n", (void*)ptr);
printf("Wert auf den ptr zeigt: %d\n", *ptr);
return 0;
}
Mögliche Ausgabe:
Wert von x: 42 Adresse von x: 0x7ffee4d1b8ac Wert von ptr: 0x7ffee4d1b8ac Wert auf den ptr zeigt: 42
Pointer und Arrays
In C sind Arrays und Pointer eng miteinander verbunden. Der Name eines Arrays entspricht der Adresse seines ersten Elements:
int arr[3] = {1, 2, 3};
int* p = arr;
printf("%d\n", *p); // 1
printf("%d\n", *(p+1)); // 2
printf("%d\n", *(p+2)); // 3
Pointer und Funktionen
Pointer können als Funktionsparameter verwendet werden, um auf Werte außerhalb der Funktion zuzugreifen oder sie zu verändern (Call by Reference).
Beispiel:
#include <stdio.h>
void verdoppeln(int* zahl) {
*zahl = *zahl * 2;
}
int main() {
int x = 10;
verdoppeln(&x);
printf("x = %d\n", x); // Ausgabe: 20
return 0;
}
Null-Pointer
Ein Pointer, der auf keine gültige Adresse zeigt, wird als Null-Pointer bezeichnet. Er wird mit dem Makro NULL aus der Header-Datei `<stddef.h>` oder `<stdio.h>` dargestellt.
int* p = NULL;
if (p == NULL) {
printf("Pointer zeigt auf nichts.\n");
}
Pointer-Arithmetik
Pointer können um ganze Zahlen verschoben werden. Dabei wird die Adresse um die Größe des Datentyps verändert, auf den sie zeigen.
Beispiel:
int arr[3] = {10, 20, 30};
int* p = arr;
p++; // zeigt jetzt auf arr[1]
printf("%d\n", *p); // Ausgabe: 20
Wichtige Hinweise
- Falsche oder uninitialisierte Pointer können zu Abstürzen (Segmentation Fault) führen.
- Speicher, der mit malloc() angefordert wird, muss mit free() wieder freigegeben werden.
- Pointer sollten immer entweder auf gültige Adressen oder auf NULL zeigen.
Siehe auch
Quellen
- ISO/IEC 9899:2018 (C18) – Programming Language C
- Kernighan, Brian W.; Ritchie, Dennis M.: The C Programming Language. Prentice Hall, 1988.
- GNU C Library Documentation