Verwendung des const-Qualifizierers mit Zeigern in C++
-
Verwendung der Notation
const type var
zur Deklaration von schreibgeschützten Objekten in C++ -
Verwendung des
const
-Qualifiers mit Zeigern zur Behandlung schreibgeschützter Objekte in C++
In diesem Artikel werden mehrere Methoden zur Verwendung des Qualifizierers const
mit Zeigern in C++ vorgestellt.
Verwendung der Notation const type var
zur Deklaration von schreibgeschützten Objekten in C++
C++ bietet das Schlüsselwort const
als Qualifizierer für Objekte, die als schreibgeschützt (unveränderlich) definiert werden müssen. const
-Variablen werden mit der Notation const type var
oder type const var
deklariert, die beide syntaktisch korrekt sind, aber die erstere wird als konventioneller Stil verwendet. Da const
qualifizierte Objekte nicht veränderbar sind, müssen sie bei der Deklaration initialisiert werden. Das macht eine Anweisung const int number;
- ungültig und wirft einen Compiler-Fehler (wahrscheinlich wird auch Ihre IDE darüber schreien).
Wenn die Variable const
initialisiert ist, kann ihr zur Laufzeit kein anderer Wert zugewiesen werden. Daher ist die dritte Zeile in der main
-Funktion des folgenden Beispiels ungültig, und der Compiler wird sie nicht verarbeiten. Beachten Sie, dass der Compiler einen Fehler meldet, wenn Sie einen Zeiger auf den gleichen Typ einer Variablen deklarieren und dann versuchen, ihr die Adresse der const
-Variablen zuzuweisen. Beachten Sie, dass der letztgenannte Fehler normalerweise außer Kraft gesetzt wird, wenn wir mit dem Flag -fpermissive
kompilieren.
#include <iostream>
int main() {
const int number = 1234;
number = 235; // Error
int *ptr = &number; // Error
return 0;
}
Verwendung des const
-Qualifiers mit Zeigern zur Behandlung schreibgeschützter Objekte in C++
Der const
-Qualifier wird oft mit Zeigern verwendet. Es gibt drei Arten von Deklarationen: const type * var
, type *const var
und const type *const var
. Die erste deklariert den var
-Zeiger auf ein schreibgeschütztes type
-Objekt, was bedeutet, dass das Objekt nicht verändert werden kann, aber der Zeiger selbst kann es. Die zweite - var
schreibgeschützter Zeiger auf type
Objekt, wobei wir unique, einen unveränderlichen Zeiger auf das Objekt deklarieren, der verändert werden kann, und die letzte definiert beide - Zeiger und das Objekt als unveränderlich.
Diese Notationen bieten mehrere nützliche Funktionen, die in den folgenden Codebeispielen erforscht werden. Wie im letzten Beispiel gezeigt, konnten wir die Adresse der const
-Variable nicht in einem non-const-Zeiger speichern, aber wenn wir den const-Spezifizierer hinzufügen, ist die Operation gültig. Beachten Sie jedoch, dass wir den gespeicherten Wert immer noch nicht über einen neu deklarierten Zeiger ändern können, wie in der vierten Zeile der main
-Schleife gezeigt wird:
#include <iostream>
using std::cout;
using std::endl;
#define STR(num) #num
int main() {
const int number = 1234;
const int *c_ptr = &number;
// *c_ptr = 42; // Error
cout << STR(number) << " - " << number << endl;
cout << STR(*c_ptr) << " - " << *c_ptr << endl;
return 0;
}
Ausgabe:
number - 1234
*c_ptr - 1234
Ein weiteres häufiges Problem bei der Verwendung des const
-Qualifizierers mit Zeigern ist die Zuweisung von non-const
-Zeigern zu den Zeigern, die auf die schreibgeschützten Objekte zeigen. Beachten Sie, dass im nächsten Codebeispiel eine neue Nicht-Konst-Variable number2
initialisiert wird, und dass c_ptr
, das als Zeiger auf ein const
-Objekt deklariert wurde, nun mit der Adresse von number2
belegt wird. Diese Operation ist in C++ legal, und die Konsequenz ist, dass wir den in der Variablen number2
gespeicherten Wert nur über c_ptr
lesen können, aber jede Änderung führt zu einem Compilerfehler.
#include <iostream>
using std::cout;
using std::endl;
#define STR(num) #num
int main() {
const int number = 1234;
const int *c_ptr = &number;
int number2 = 3456;
c_ptr = &number2;
// *c_ptr += 12; // Error
number2 += 12;
cout << STR(number) << " - " << number2 << endl;
cout << STR(*c_ptr) << " - " << *c_ptr << endl;
return 0;
}
Ausgabe:
number2 - 3468
*c_ptr - 3468
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn FacebookVerwandter Artikel - C++ Const
- Const am Ende der Funktion in C++
- Das Schlüsselwort const in C++
- Verwendung des const-Schlüsselworts mit Zeigern in C++