Doppelzeiger
-
Hallo,
wir haben im Moment die Aufgabe(1) int a = 5;
(2) int* pa = &a;
(3) pa = 6;
(4) a = 7;
(5) int b = 8;
(6) int pb = pa;
(7) int** ppa = &pa;
(8) ppa = &pb;
(9) pb = &b;Und sollen hier Schrittweise angeben, was genau in welcher Zeile geschieht.
Bis Zeile 5 auch kein Problem glaube ich(1) A -> 5 // A bekommt den Wert 5
(2) Pa -> Value_A // *pa zeigt auf den Wert von A, also 5
(3) Pa -> 6 // In A ist nun der Wert 6 gespeichert
(4) A -> 7 // Nun wird der Wert 7 in A gespeichert
(5) B -> 8 // Integer B wird erstellt und bekommt den Wert 8 zugewiesenWas aber jetzt in Zeile 6?
Zeigt der Pointer pb einfach nur auf pa ? oder auf den Wert von pa ? Da Pa ja auf a zeigt, also auf 7 ?
Ähnlich problematisch gestaltet sich das bei 7-9 dann auch bei mir ... Vielleicht kann mir das hier ja jemand erklären.
Vielen Dank für Eure Hilfe.
LG
-
(6) pb wird als Zeiger auf int definiert und der Inhalt von pa wird nach pb kopiert. Und ich meine pa und nicht *pa. pb zeigt dann auch auf a.
(9) ist nichts anderes als (2), nur existiert die Variable pb schon.
-
Ein Zeiger ist auch nur eine Variable. Der Inhalt ist halt kein Zeichen oder Fließkommazahl oder Ganzzahl sondern eine Adresse.
In einem Doppelzeiger wird die Adresse eines Zeigers gespeichert.
An die Adresse einer Variablen kommst du mit dem Adressoperator &.
-
Danke zu 6 und 9 , leider ist die ja eher eine direkte Antwort und keine erklärung und somit sitze ich bei 7+8 immer noch auf dem Schlauch, da ich in Zukunft solche Pointerproblematiken gerne selber lösen würde, wäre es gut, wenn eine kleine Erklärung dabei wäre, danke :):)
EDIT:// oh den zweiten Beitrag habe ich erst nach diesem Beitrag gelesen.
Heißt das , wenn da steht *pa=&pb, dass der Zeiger pa die Adresse von pb zugewiesen bekommt ?
-
Broderik schrieb:
Heißt das , wenn da steht *pa=&pb, dass der Zeiger pa die Adresse von pb zugewiesen bekommt ?
Wenn das Sternchen Teil einer unvollständigen Typangabe im Zuge einer Deklaration ist: ja.
-
Broderik schrieb:
Heißt das , wenn da steht *pa=&pb, dass der Zeiger pa die Adresse von pb zugewiesen bekommt ?
Nein, das heißt, dass der Wert an *pa (also von a) nun die Adresse von pb enthält.
-
Dies bezieht sich auf den Ausdruck '*pa = &pb'
Du meinst wohl eher:
int* pa = &pb;
Dann bekommt der Wert der Variablen pa die Adresse von pb zugewiesen.
-
Also erstmal danke, nur etwas verwirrend, wenn Ihr bei euren Erklärungen euch nicht mal sicher seid
^^ Trotzdem danke :):)
-
Wenn man aber die Definitionen von oben nimmt, meckert der Compiler, da er einem int keine Adresse zuweisen mag.
-
Broderik schrieb:
Also erstmal danke, nur etwas verwirrend, wenn Ihr bei euren Erklärungen euch nicht mal sicher seid
^^ Trotzdem danke :):)
Deine Angaben sind ja auch nicht ausreichend.
Bei der Definition
int *pa
ist pa ein Zeiger und *pa ein int.
Wenn du da gleich eine Zuweisung machstint *pa = &a;
wird der Zeiger initialisiert (mit der Adresse von a). Aufgeteilt in zwei Zeilen wäre das:int *pa; pa = &a;
Bei dem Ausdruck
*pa = &a;
hast du aber auf der linken seite ein int und auf der rechten Seite eine Adresse. Das passt nicht.Bei deiner Erklärung
Broderik schrieb:
..., dass der Zeiger pa die Adresse von pb zugewiesen bekommt
wäre das
pa = &pb;
Passt bei dir aber auch nicht, das pa und pb beide vom Type int* (Zeiger auf int) sind.
&pb ergibt aber ein int** (Zeiger auf Zeiger auf int).
-
DirkB schrieb:
Wenn man aber die Definitionen von oben nimmt, meckert der Compiler, da er einem int keine Adresse zuweisen mag.
In einer abstrakten Sicht wie in C ist das auch so, auf low level Ebene gibt es da keine Probleme. Dennoch ist meine Aussage deshalb nicht unwar, wenn man versteht, was die Zuweisung zur Laufzeit erwirken würde.
-
Weiß vielleicht einer, wie ich die Beziehung zwischen den Variablen a und b sowie den Zeigern pa, pb und ppa grafisch darstelle?
-
Hallo123 schrieb:
Weiß vielleicht einer, wie ich die Beziehung zwischen den Variablen a und b sowie den Zeigern pa, pb und ppa grafisch darstelle?
Naheliegenderweise mit einem Pfeil. Oder was möchtest du genau wissen?