Verwendung des const-Qualifizierers mit Zeigern in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung der Notation const type var zur Deklaration von schreibgeschützten Objekten in C++
  2. Verwendung des const-Qualifiers mit Zeigern zur Behandlung schreibgeschützter Objekte in C++
Verwendung des const-Qualifizierers mit Zeigern 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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 Facebook

Verwandter Artikel - C++ Const

Verwandter Artikel - C++ Pointer