C++ Zeiger verstehen: Ein praktischer Leitfaden
C++ Zeiger
Dieses Tutorial erklärt C++ Zeiger, ihre Funktionsweise und praktische Beispiele, um Ihnen zu helfen, dieses wesentliche Sprachfeature zu meistern.
In C++ ist ein Zeiger eine Variable, die die Speicheradresse einer anderen Variable speichert. Zeiger ermöglichen direkte Speichermanipulation, dynamische Allokation und effiziente Datenverarbeitung.
Adressen in C++
Bei einer Variablen var gibt der Ausdruck &var ihre Adresse im Speicher zurück. Zum Beispiel:
Beispiel 1: Variablenadressen in C++ ausgeben
#include <iostream> using namespace std; int main() { // Variablen deklarieren int var1 = 3; int var2 = 24; int var3 = 17; // Adresse von var1 ausgeben cout << "Adresse von var1: " << &var1 << endl; // Adresse von var2 ausgeben cout << "Adresse von var2: " << &var2 << endl; // Adresse von var3 ausgeben cout << "Adresse von var3: " << &var3 << endl; }
Ausgabe
Adresse von var1: 0x7fff5fbff8ac Adresse von var2: 0x7fff5fbff8a8 Adresse von var3: 0x7fff5fbff8a4
Adressen werden im hexadezimalen Format angezeigt. Der Unterschied von 4 Bytes zwischen aufeinanderfolgenden Adressen spiegelt die 4-Byte-Größe eines int auf einem 64-Bit-System wider.
Hinweis: Die genauen Adressen können bei jedem Programmlauf variieren.
C++ Zeiger
Wie gezeigt, speichern Zeiger Adressen statt direkter Werte. Die Deklaration eines Zeigers ist unkompliziert:
int *pointVar;
Hier ist pointVar ein Zeiger auf einen int. Die bevorzugte Syntax platziert den Sternchen neben dem Typ:
int* pointVar; // bevorzugte Syntax
Mehrere Deklarationen sind ebenfalls möglich:
int* pointVar, p;
In dieser Zeile ist pointVar ein Zeiger, während p ein regulärer int ist. Das Sternchen wird mit dem Variablennamen assoziiert, nicht mit dem Typ.
Tipp: Der *-Operator wird zur Deklaration von Zeigern verwendet, nicht zur Multiplikation.
Adressen Zeigern zuweisen
Um einen Zeiger an die Adresse einer Variable zu binden, verwenden Sie den Adressoperator &:
int* pointVar, var; var = 5; // Adresse von var dem pointVar-Zeiger zuweisen pointVar = &var;
Nun hält pointVar die Speicheradresse von var.
Wert aus der Adresse über Zeiger erhalten
Der Dereferenzierungsoperator * ruft den Wert ab, der an der Adresse gespeichert ist, die ein Zeiger hält:
int* pointVar, var; var = 5; pointVar = &var; cout << *pointVar << endl; // Ausgabe: 5
Hier liefert *pointVar den Wert von var (5). Der Operator heißt Dereferenzierungsoperator.
Hinweis: In C++ sind pointVar (der Zeiger) und *pointVar (der Wert, auf den er zeigt) unterschiedliche Entitäten.
Beispiel 2: Funktionsweise von C++ Zeigern
#include <iostream> using namespace std; int main() { int var = 5; // Zeigervariable deklarieren int* pointVar; // Adresse von var speichern pointVar = &var; // Wert von var ausgeben cout << "var = " << var << endl; // Adresse von var ausgeben cout << "Adresse von var (&var) = " << &var << endl << endl; // Zeiger pointVar ausgeben cout << "pointVar = " << pointVar << endl; // Inhalt der Adresse ausgeben, auf die pointVar zeigt cout << "Inhalt der Adresse, auf die pointVar zeigt (*pointVar) = " << *pointVar << endl; return 0; }
Ausgabe
var = 5 Adresse von var (&var) = 0x61ff08 pointVar = 0x61ff08 Inhalt der Adresse, auf die pointVar zeigt (*pointVar) = 5
Wert ändern, auf den Zeiger zeigen
Wenn pointVar auf var zeigt, ändert die Modifikation von *pointVar die ursprüngliche Variable:
int var = 5; int* pointVar; pointVar = &var; *pointVar = 1; cout << var << endl; // Ausgabe: 1
Sowohl pointVar als auch &var halten die gleiche Adresse; die Änderung des dereferenzierten Werts aktualisiert var.
Beispiel 3: Wert ändern, auf den Zeiger zeigen
#include <iostream> using namespace std; int main() { int var = 5; int* pointVar; // Adresse von var speichern pointVar = &var; // var ausgeben cout << "var = " << var << endl; // *pointVar ausgeben cout << "*pointVar = " << *pointVar << endl << endl; cout << "Wert von var auf 7 ändern:" << endl; // Wert von var auf 7 ändern var = 7; // var ausgeben cout << "var = " << var << endl; // *pointVar ausgeben cout << "*pointVar = " << *pointVar << endl << endl; cout << "Wert von *pointVar auf 16 ändern:" << endl; // Wert von var auf 16 ändern *pointVar = 16; // var ausgeben cout << "var = " << var << endl; // *pointVar ausgeben cout << "*pointVar = " << *pointVar << endl; return 0; }
Ausgabe
var = 5 *pointVar = 5 Wert von var auf 7 ändern: var = 7 *pointVar = 7 Wert von *pointVar auf 16 ändern: var = 16 *pointVar = 16
Häufige Fehler bei der Arbeit mit Zeigern
Nachfolgend sind typische Fehler und die korrekte Handhabung von Zeigern aufgeführt:
int var, *varPoint; // Falsch! varPoint ist eine Adresse aber var nicht varPoint = var; // Falsch! // &var ist eine Adresse // *varPoint ist der Wert, der in &var gespeichert ist *varPoint = &var; // Richtig! // varPoint ist eine Adresse und so ist &var varPoint = &var; // Richtig! // sowohl *varPoint als auch var sind Werte *varPoint = var;
Empfohlene Weiterführende Themen:
- Wie man generische Datentyp-Zeiger mit void-Zeigern verwendet?
- Wie man ein Array mit einem Zeiger darstellt?
- Wie man Zeiger mit Funktionen verwendet?
- Wie man Zeiger mit Strukturen verwendet?

C Sprache
- C++-Datentypen verstehen: Grundlagen, Modifizierer und Best Practices
- C++-Operatoren meistern: Ein vollständiger Leitfaden mit praktischen Beispielen
- C++-Kommentare: Best Practices für lesbaren, wartbaren Code
- C++ Klassentemplates meistern: Ein praktischer Leitfaden
- C-Zeiger meistern: Praxisnahes Experten-Tutorial
- C++ Zeiger meistern: Konzepte, Beispiele & praktische Anwendungen
- C-Zeiger meistern: Praktische Schritte zur fortgeschrittenen Programmierung
- C++ Programmiersprache: Überblick & Kernfeatures
- C++ Konstanten & Literale: Typen, Syntax & Best Practices
- C++ Operatoren: Typen, Nutzung & Best Practices