const Zeiger auf Integer mit const int Addresse initialisieren
-
Hi,
folgender code:
const int p = 10; int * const j = &p;generiert folgende Fehlermeldung:
error C2440: 'initializing' : cannot convert from 'const int *' to 'int *const 'Warum spuckt der Compiler diese Fehlermeldung aus? Ich initialsiere einen Konstanten Zeiger auf ein Integer mit einer Addresse eines Konstanten Integer.
Mir ist klar das es wenig Sinn macht, ueber den Zeiger kann man spaeter den Wert nicht aendern -- da der ja Konstant ist --. Sollte es dem Compiler dann nicht egal sein ob p const oder nicht const ist??
-
Dein Zeiger ist konstant, aber nicht das worauf er zeigt. Das heißt, du kannst dem Zeiger keine andere Adresse zuweisen, aber du könntest den Wert, auf den er zeigt, ändern. Logischerweise darf der daher keine Konstante sein und daher bekommst du einen Fehler. Du brauchst einen Zeiger auf ein konstanten int. Also:
const int* foo = &p; // oder das gleiche in anderer Reihenfolge int const* foo = &p;Solche Konstrukte liest man am besten von rechts nach links, wobei man "*" als "Zeiger auf" liest:
const int* foo;"foo ist ein Zeiger auf einen int, der const ist." Oder eben
int const* foo;"foo ist ein Zeiger auf einen konstanten int."
Aber eben nichtint * const foo;"foo ist ein konstanter Zeiger auf einen int." (An sich ist das natürlich ein gültiges Konstrukt, bloß nicht das, was du hier möchtest)
Funktioniert auf englisch etwas besser
.Du kannst natürlich auch den Zeiger selbst noch konstant machen, falls gewünscht:
int const* const foo;"foo ist ein konstanter Zeiger auf einen konstanten int."
-
HottoMotto schrieb:
Mir ist klar das es wenig Sinn macht, ueber den Zeiger kann man spaeter den Wert nicht aendern -- da der ja Konstant ist --. Sollte es dem Compiler dann nicht egal sein ob p const oder nicht const ist??
Falls SeppJ recht hat, dann geht es. Mal ausprobieren.
#include <iostream> using namespace std; int main() { /*const*/ int p = 10; int * const j = &p; cout << "p=" << p << '\n'; cout << "*j=" << *j << '\n'; *j = 11; cout << "*j=" << *j << '\n'; }Ausgabe
p=10 *j=10 *j=11Jupp, es geht.
-
SeppJ schrieb:
Dein Zeiger ist konstant, aber nicht das worauf er zeigt. Das heißt, du kannst dem Zeiger keine andere Adresse zuweisen, aber du könntest den Wert, auf den er zeigt, ändern. Logischerweise darf der daher keine Konstante sein und daher bekommst du einen Fehler. Du brauchst einen Zeiger auf ein konstanten int. Also:
const int* foo = &p; // oder das gleiche in anderer Reihenfolge int const* foo = &p;Solche Konstrukte liest man am besten von rechts nach links, wobei man "*" als "Zeiger auf" liest:
const int* foo;"foo ist ein Zeiger auf einen int, der const ist." Oder eben
int const* foo;"foo ist ein Zeiger auf einen konstanten int."
Aber eben nichtint * const foo;"foo ist ein konstanter Zeiger auf einen int." (An sich ist das natürlich ein gültiges Konstrukt, bloß nicht das, was du hier möchtest)
Funktioniert auf englisch etwas besser
.Du kannst natürlich auch den Zeiger selbst noch konstant machen, falls gewünscht:
int const* const foo;"foo ist ein konstanter Zeiger auf einen konstanten int."
Danke fuer die Erklaerung, jetzt habe ich es verstanden
