Frage zu den zeigern
-
Hallo ich habe ein frage zu den zeigern: Was bedeutet "referenzieren" und "dereferenzieren" bzw. wieso schreibt man beim ersten
int *ap; ap=a;also in der zweiten zeile ohne *
und beim zweiteren
*ap = ...
-
int* p = q; // Hier weißt du dem Zeiger selbst etwas zu, trotz * p = q; // Genau so wie hier *p; // Hier dereferenzierst du den Zeiger. *p = 3; // Hier weißt du der Variable auf die der Zeiger zeigt etwas zu
-
*zeigerist das, worauf der Zeiger zeigt.int a; int *b; b = &a; // b zeigt auf a *b = 2; // hier wird a verändert.
-
Das hängt davon ab, was du bei dem Zeiger ändern willst.
Die Adresse wohin er zeigt, wird ohne dem * angesprochen.
Den Wert an der Adresse wo der Zeiger hinzeigt wird mit dem * angesprochen.
Die Adresse einer Variablen bekommst u mit dem Adressoperator &.int *ap *bp, i, j; ap = &i; // ap zeigt auf i. *ap = 5; // Da ap auf i zeigt, wird i verändert bp = ap; // ap zeigt auf die selbe Adresse wie ap ap = &j; // ap zeigt auf j. *ap = 6; // Da ap auf j zeigt, wird j verändert *bp = 7; // Da bp auf i zeigt, wird i verändert
-
Danke für die Antworten, also wäre diese zeile
int* p = q; // Hier weißt du dem Zeiger selbst etwas zu, trotz *schon eine Referenzierung ? Außerdem habe ich eine andere frage, darf man einm double zeiger auf eine integervariable zeigen lassen und umgekehrt?
-
Nein, das ist keine Referenzierung, sondern eine Zuweisung. Du weist der Zeigervariable
pden Wert der Zeigervariableqzu, damit zeigenpundqauf die gleiche Adresse.
Grundsätzlich darf man alles auf alles zeigen lassen, wie sich das Ganze dann aber beim Zugriff verhält ist nicht definiert. Hängt vom Anwendungsfall ab, manchmal ist es erwünscht, manchmal nicht.
-
Namal schrieb:
Danke für die Antworten, also wäre diese zeile
int* p = q; // Hier weißt du dem Zeiger selbst etwas zu, trotz *schon eine Referenzierung ?
Hier passiert das gleiche, als wenn du
int a = 5;schreibst. Es wird eine Variable p vom Typ int* definiert, die mit dem Wert q initialisiert wird (q muss daher auch schon ein int* sein). Das Sternchen ist in diesem Zusammenhang keine Dereferenzierung, sondern sagt, dass p ein Zeigertyp sein soll.
(Achtung, häufiger Fehler:
int* a,b,*c;Hier ist a ein Zeiger auf int, b ein int, c ein Zeiger auf int. Das Sternchen gehört nicht zum Typen, sondern zum Variablennamen, auch wenn es den Typen der Variable ändert. Daher schreibt man oft
int *a, b, *c;oder lässt mehrere Definitionen in einer Zeile besser gleich sein, wenn dies verwirrend sein könnte)
Außerdem habe ich eine andere frage, darf man einm double zeiger auf eine integervariable zeigen lassen und umgekehrt?
Jain. Du darfst nicht. Aber du kannst es durch reinterpret_casts trotzdem so hinbiegen. Es wird auch nicht das passieren, was du vielleicht denkst. Es wird einfach Mist rauskommen, sofern du nicht die genauen technischen Hintergründe kennst.
Normalerweise darf ein Zeiger nur auf spezialisiertere Typen zeigen (oder solche mit lascheren Qualifizierern):
class base{}; class derived: public base {}; int variable; const int konstante; int *a; a = &variable; // ok a = &konstante; // nicht ok const int *b; b = &variable; // ok b = &konstante; // ok base basis; derived abgeleitet; base *c; c = &basis; // ok c = &abgeleitet; // ok, abgeleitet ist ein base derived *d; d = &basis; // nicht ok, ein base ist nicht unbedingt ein derived d = &abgeleitet; // okIch hoffe übrigens mal, dass du schon C++ kannst und nun aus Not oder Interesse die Zeiger lernst. Dies sollte nämlich nicht unbedingt der normale Grundstoff für C++ sein, da es in C++ oft wesentlich bessere Lösungen als Zeiger gibt.
-
[quote="SeppJ"]Also wird mit
int* p = q;Eine zeigervariable zugewiesen, das heißt dann *p zeigt auf dieselbe variable wie *q, richtig?
und irgendwo muss ich dann noch festlegen worauf *q zeigt und das mache ich mit dem referenzieren
q=&a;Ok ich les mir erstmal das durch
-
Nicht ganz
*p bzw *q sind Werte, in diesem Fall vom Typ int.
p und q sind die Zeiger.p Zeigt auf den selben Wert wie q.
-
[quote="Namal"]
SeppJ schrieb:
Also wird mit
int* p = q;Eine zeigervariable zugewiesen, das heißt dann *p zeigt auf dieselbe variable wie *q, richtig?
Jo. Prinzipiell ist das eine normale Initialisierung, deswegen ist das für dich möglicherweise etwas verwirrend; stell es dir so vor:
[TYP] [IDENTIFIER] = [WERT];
Hier ist TYP
int*, IDENTIFIER istpund WERT istq(s Wert :D). Das nennt sich copy-initialisation.P.S.: Ich würde übrigens nicht
*qund*pschreiben, genau genommen müssen die Sternchen da weg
DirkB schrieb:
p Zeigt auf den selben Wert wie q.
Eine ziemlich lustige Erklärung. Du meinst,
qzeigt auf dieselbe Variable
-
Namal schrieb:
und irgendwo muss ich dann noch festlegen worauf *q zeigt
Nicht irgendwo, sondern irgendwo vorher.