Was ist der Unterschied zwischen „const“, „const pointer“ und „pointer to const“ in C?
- Was bedeutet const in C?
- Was ist ein pointer to const?
- Was ist ein const pointer?
- Was braucht man einen const pointer to const data?
- Zusammenfassung
In der Programmiersprache C ist das Schlüsselwort const ein zentraler Bestandteil, um Konstantheit oder Unveränderlichkeit von Variablen auszudrücken. Es gibt hierbei oft Verwirrung, vor allem wenn es zusammen mit Zeigern (Pointers) genutzt wird. In diesem Artikel erläutern wir ausführlich die Begriffe const, const pointer und pointer to const und deren Unterschiede.
Was bedeutet const in C?
Das Schlüsselwort const wird verwendet, um anzugeben, dass der Wert einer Variablen nach der Initialisierung nicht mehr verändert werden darf. Das hilft dem Programmierer, versehentliche Modifikationen zu vermeiden und zudem ermöglichen manche Compiler Optimierungen.
Beispielsweise:
const int zahl = 10;Hier ist die Variable zahl ein konstanter Wert. Jeder Versuch, den Wert später zu ändern, führt zu einem Fehler beim Kompilieren.
Was ist ein pointer to const?
Ein pointer to const (auf Deutsch: Zeiger auf eine Konstante) ist ein Zeiger, der auf einen Wert verweist, der nicht verändert werden darf. Das bedeutet aber nicht, dass der Zeiger selbst nicht verändert werden kann — der Zeiger kann also auf eine andere Adresse zeigen, aber der Wert an der Adresse darf nicht verändert werden.
Beispiel:
const int *ptr;Hier zeigt ptr auf einen int-Wert, den man nicht über ptr verändern darf. Eine Schreiboperation wie *ptr = 5; ist nicht erlaubt. Allerdings kann ptr selbst auf eine andere Speicheradresse zeigen.
Was ist ein const pointer?
Ein const pointer (konstanter Zeiger) bedeutet, dass der Zeiger selbst nicht verändert werden kann, also seine Adresse immer gleich bleibt. Der Wert, auf den der Zeiger zeigt, kann hingegen verändert werden.
Beispiel:
int * const ptr;In diesem Fall ist ptr ein konstanter Zeiger auf ein int. Man kann also *ptr = 5; ausführen und den Wert über den Zeiger ändern. Jedoch kann man nicht ptr = &anderer_int; schreiben, da der Zeiger selbst konstant ist.
Was braucht man einen const pointer to const data?
Eine weitere Variante ist der konstante Zeiger auf eine Konstante:
const int * const ptr;Hier kann weder der Zeiger geändert werden (kein Umsetzen auf eine andere Adresse), noch der Wert, auf den er zeigt (keine Modifikation des Ziels). Diese Kombination ist sinnvoll, wenn man sicherstellen will, dass sowohl Zeiger als auch referenzierte Daten unveränderlich bleiben.
Zusammenfassung
Das Positionieren von const in der Deklaration von Zeigern ist entscheidend für das Verständnis dessen, was konstant ist:
Steht const vor dem Typ (z.B. const int *), so ist das Ziel unveränderlich.
Steht const hinter dem Sternchen (z.B. int * const), so ist der Zeiger konstant, nicht das Ziel.
Man kann auch beide kombinieren (const int * const), dann sind Zeiger und Ziel konstant.
Durch bewussten Einsatz dieser Typen kann man den Code lesbarer und sicherer machen, da Modifikationen explizit eingeschränkt werden.
