[C++ - Primer]Frage zu Zeigern
-
Hallo zusammen,
ich hab da mal eine Frage bezüglich des Buchs "C++ Primer".
Da heisst es auf S.153 in einem Beispiel (Thema: Zeiger), dass
folgende Operation zulässig ist.Zitat:
"Die Zuweisung des Literals 0 oder eines konstanten Objekts, von dem
Sie wissen, dass sein Wert bei der Kompilierung 0 beträgt, ist jedoch
erlaubt:"int ival; int zero = 0; const int c_ival = 0; int *pi; ... pi = c_ival // Gültig: c_ival ist ein konstantes Objekt mit dem // Kompilierungszeitwert 0.Soweit so gut.
Nachdem ich aber weitergelesen hatte, stach mir
folgendes Beispiel ins Auge (Thema: Zeiger auf konstante Objekten,
S.162), was eigentlich obigem für meine Begriffe widerspricht:Zitat:
"Außerdem kommt es zu einem Compilerfehler, wenn wir einem einfachen,
nicht konstanten Zeiger die Adresse eines konstanten Objekts zuweisen:"const double pi = 3.14; double *ptr = π // Fehler. ptr ist ein einfacher ZeigerFür mich erstmal ein klarer Widerspruch

Ja, was denn nu??Vielen Dank schonmal <<frage.txt>>
P.S:
Noch verwirrender wird das ganze, wenn man sich die erläuterten "Einschränkungen für die Initialisierung und Zuweisung von Zeigern"
anschaut:
Dort heisst es, dass es nur vier gültige Arten von Werten gibt, die sich zum initialisieren bzw. zuweisen von Zeigern eignen:- Ein konstanter Ausdruck
- Die Adresse eines Objekts von geeignetem Typ Die Adresse, die um 1 über ein anderes Objekt hinausgeht
- Ein anderer gültiger Zeiger desselben Typs
So, wenn man jetzt wieder weiterliest, so sieht man auf S. 163 folgendes
Beispiel:dval = 3.14159; double *ptr = &dval; // Gültig: ptr zeigt auf ein nicht konstantes Objekt vom Typ double *ptr = 2.72; // Gültig: ptr ist ein einfacher Zeiger (Wie bitte?) cout << *cptr; // Gültig: Gibt 2.72 aus.Die letzte Zuweisung *ptr = 2.72 dürfte aber doch rein per Definition eigentlich _nicht_ gültig sein?!

Edit: Rechtschreibfehler
Edit2: Fragen umformuliert
-
Ist kein Widerspruch. Im ersten Beispiel steht die Adresse (0) in c_ival. Diese übergibst du dem Pointer. Im zweiten Beispiel hast du ein Objekt pi, dessen Adresse du an den Pointer übergibst.
[Edit] Und im dritten Beispiel übergibst du den Wert an das Objekt, auf das der Pointer zeigt, nicht an den Pointer selbst.
-
NewProggie schrieb:
Nachdem ich aber weitergelesen hatte, stach mir
folgendes Beispiel ins Auge (Thema: Zeiger auf konstante Objekten,
S.162), was eigentlich obigem für meine Begriffe widerspricht:
Zitat:
"Außerdem kommt es zu einem Compilerfehler, wenn wir einem einfachen,
nicht konstanten Zeiger die Adresse eines konstanten Objekts zuweisen:"const double pi = 3.14; double *ptr = π // Fehler. ptr ist ein einfacher ZeigerWo ist hier der Widerspruch? Eine 0 kann implizit in einen Nullzeiger umgewandelt werden bzw. ist ein Nullzeiger, aber eine implizite Umwandlung eines (const double)-Zeigers (das liefert der Adressoperator hier zurück) kann natürlich nicht in einen normalen double-Zeiger (über den man das bezeigte Objekt verändern kann) umgewandelt werden.
Das sind zwei völlig verschiedene Baustellen. Mach dir klar, welcher Ausdruck hier welchen Typ hat, dann sollte es klarer werden.NewProggie schrieb:
dval = 3.14159; double *ptr = &dval; // Gültig: ptr zeigt auf ein nicht konstantes Objekt vom Typ double *ptr = 2.72; // Gültig: ptr ist ein einfacher Zeiger (Wie bitte?) cout << *cptr; // Gültig: Gibt 2.72 aus.Die letzte Zuweisung *ptr = 2.72 dürfte aber doch rein per Definition eigentlich _nicht_ gültig sein?!

Wieso? Siehe Tipp oben. *ptr für ptr vom Typ double* liefert ein double& zurück (keine Gewähr), welches man verändern kann.