Doppelzeiger

Mrbrown

Grünschnabel
hi,

Ich hätte wieder mal eine Frage :)
C++:
int x = 0;
int y = 0;
int *p1 = &x;
int *p2 = &y;
int **pp;

pp = &p1;

**pp = 10;

pp = &p2;

**pp = 20;

*pp = &x;

**pp = **pp + 1;

printf("x: %d\ny: %d\n", x, y);
      
       if (p1 == p2)

printf("p1 == p2");
      
       else

printf("p1 != p2");

Meine Frage zu dem Programm, es wird ja am schluss ausgegeben P1==P2. Ich bin mir jetzt nicht sicher ob ich das verstanden habe. Erst zeigt PP auf P1, dann auf P2...und dann kommt *pp=&x; Bei diesem schirtt bin ich mir nicht ganz sicher was passiert. P2 bekommt auf alle fälle die selbe adresse wie x und somit wie P1, aber wie kann ich mir das vorstellen.....

So würde ich mir das bis jetzt erklären

PP zeigt ja noch auf P2
durch *pp=&x
ändert PP die adresse von P2 auf die adresse von x....oder soll das heißen P2 zeigt jetzt auch auf x?

Hoffe ihr könnt mir helfen:)
Liebe Grüße Mr.Brown
 
Zuletzt bearbeitet von einem Moderator:
Hi

Genau, p2 zeigt jetzt auch auf x. Der Wert von p2 wird geändert.

Folgende drei Zeilen bedeuten das Gleiche:
C++:
*pp = &x;
p2 = &x;
*&p2 = &x;
Und weil pp ja &p2 ist muss *pp p2 ergeben.

Die Adresse von p2 wird nicht geändert (nur die Adresse von y (vorher) bzw. x (nach der Anweisung)
die als Zahl in der Variable p2 gespeichert ist). Einfach so Adressen einer Variablen ändern geht generell nicht.
 
okay super danke:)

Dann kann ich mir so vorstellen,dass bei einem Doppelzeiger 1 * bedeutet das ich direkt die Variable anspreche, und kein stern also pp=&p2 direkt ein objetkt oder einen normalen zeiger anspreche der bereits auf eine Variable zeigt?
 
Nicht wirklich.

Vielleicht hilft es ja, das Ganze aus der einfachen Pointersicht anzugehen,
mit einem int a; und int *p;

Kurze Wiederholung:
a ist dafür gedacht, Zahlen zu speichern, klar. Irgendwelche Zahlen (na gut, keine Kommazahlen usw. egal)
p ist auch dafür gedacht, Zahlen zu speichern, Rein theoretisch können es genau wie bei a irgendwelche Zahlen
sein, nur ist p eher für Adressen gedacht, weil p eben eine kleine Besonderheit mit dem Stern erlaubt, weiter unten.
& ergibt die Adresse irgendeiner Variablen. &a ist die Adresse von a, &p die von p.
Mit zB. p = &a; speichert man natürlich die Adresse der Zahl a (als Zahl) in der Variable p.
p allein meint immer die Zahl (Adresse), die in p gespeichert ist, genau wie bei a.
Nur, was p eben zusätzlich kann: *p ist das, was an der gespeicherten Adresse zu finden ist.

Kleine Nebenbemerkung: Wenn man einen Pointer gerade erst macht und gleichzeitig schon was zuweist, also
int *p = &a;, ist das gleichbedeutend mit int *p; p = &a;.
Hier wird also nicht gleich *p geändert.

Bei int *p und float *p und blabla *p usw. ist p immer eine ganze (int-artige) Zahl,
unabhängig vom angegeben Variablentyp (weil Speicheradressen nun mal keine Kommazahlen oder blablas sind).
Was man bei Pointern da angibt ist, was *p für ein Ding ist. Für int *p ist es eben ein int.

Und ein Doppelpointer int **p kann in jedem Fall als ganz normaler einfacher Pointer betrachtet
werden, der als Ziel nur eben wieder einen Pointer hat. (int) *p und (float) *p und (int*) *p
Bei
C++:
int x;
int *p1:
int **pp;
p1 = &x;
pp = &p1;
hat p1 natürlich die Adresse von x als Wert, und pp hat die Adresse von p1 als Wert.
Fertig. pp interessiert nur p1, ganz egal was p1 mit x zu tun hat.

*pp greift auf das zu, was an der in pp gespeicherten Adresse ist, und zwar p1
*p1 greift auf das zu, was an der in p1 gespeicherten Adresse ist, und zwar x
=> *(*pp) ist auch x. Und die Klammern noch weg ergibt **pp, ist x
 
pointer.png


ich glaub jetzt komm ich der sache schon näher. Hab mal versucht das aufzuzeichnen. Hoffe es ist so verständlich.

P2 zeigt auf Y. Und pp zeigt auf p2. Dann ändert pp den wert von p2 auf die adresse von x?

Könnte ich mir das so vorstellen?:)
 
Zurück