Zeigerarithmetik zum Haareraufen
-
#include <iostream.h> void fp(int *a, int *b, int* &c) { cout<<"*b="<<*b<<"\n"; (*a)++; cout<<"*b="<<*b<<"\n"; a=b; cout<<"*b="<<*b<<"\n"; (*a)++; cout<<"*b="<<*b<<"\n"; c=a; cout<<"*b="<<*b<<"\n"; (*c)++; cout<<"*b="<<*b<<"\n"; cout<<b; } int main() { int d=0, e=0, f=0; int *pd=&d, *pf=&f; fp(pd,&e,pf); (*pf)++; cout<<"d="<<d<<"\n"; cout<<"e="<<e<<"\n"; cout<<"f="<<f<<"\n"; cout<<&e; return 0; }Meine Frage ist eigentlich ganz simpel: Wieso wird e hier 3. Ich wei- das die Adresse von e an *b in der fp uebergeben wird aber ich versteh nicht wie es erhoeht wird. Eine schrittweise erklaerung waehre sehr hilfreich.
MFG niesel
-
Wie Du schon korrekt sagtest landet die Adresse von e im Zeiger b der Funktion. Dazu die relevanten Zeilen:
Zeile 22. Aufruf der Funktion mit der Adresse von e (nach b) und einer Referenz auf pf (nach c)
Zeile 7. Die Adresse aus b landet in a, also zeigen a und b jetzt auf das e aus main
Zeile 9. Das worauf a zeigt wird erhöht. Auf 1
Zeile 11. Die Adresse aus a (und b) landet in c, also zeigen a, b und c jetzt auf das e aus main. Da c by-reference übergeben wurde, wirkt sich das auch auf pf aus main aus
Zeile 13. Das worauf c zeigt wird erhöht. Auf 2
Zeile 23. Das worauf pf zeigt wird erhöht. Auf 3
-
Na das ist ja mal ein Zeigergewusel... na schauen wir mal:
Du sagtest bereits richtig: Nach Aufruf von fp zeigt jetzt also b auf e.
Die nächste wichtige Stelle ist hier:a=b;Jetzt zeigt also a auf die gleiche Stelle wie b, und das ist e (a zeigt nun also auch auf e).
(*a)++; //e wird das erstemal erhöht!Weiter gehts dann hier:
c=a;Das ist etwas komplizierter. c ist ja eine Referenz auf einen Pointer auf int. Und c verweist auf pf aus der main() Funktion. Wenn du hier also c eine neue Adresse zuweist (nämlich die von a), biegst du damit auch den pointer fp auf die Adresse von a um. c und pf zeigen nun also auf die Stelle auf die auch a zeigt (nämlich auf e).
(*c)++; //e wird zum zweitenmal erhöht!Abschließend passiert dann das in der main Funktion:
(*pf)++; //e wird ein drittes mal erhöht!
-
void fp(int *a, int *b, int* &c) // int* &c hier wird die adresse der variable c als referenz übergebn (pointer auf pointer) { cout<<"*b="<<*b<<"\n"; *a = 0, *b = 0, *c = 0 (*a)++; variable auf der adresse von a wird inkrementiert cout<<"*b="<<*b<<"\n"; *a = 1, *b = 0, *c = 0 a=b; a wird die adresse von b übergeben cout<<"*b="<<*b<<"\n"; (a = b) *a=0, *b=0, *c=0 (*a)++; variable auf der adresse von a wird inkrementiert cout<<"*b="<<*b<<"\n"; (a = b) *a=1, *b=1, *c=0 c=a; c wird die adresse von a übergeben ACHTUNG hier wird der adresswert von c verändert, da c als referenz übergeben wurde also auch der adresswert des übergebenen pointer!!!! cout<<"*b="<<*b<<"\n"; *(a = b = c) = 1 (*c)++; ..... cout<<"*b="<<*b<<"\n"; *(a = b = c) = 2 cout<<b; } int main() { int d=0, e=0, f=0; int *pd=&d, *pf=&f; fp(pd,&e,pf); pf wurde verändert da er als referenz übergeben wurde (*pf)++; pf = &e !!! e war nach der methode pf() gleich 2 cout<<"d="<<d<<"\n"; d = 1 cout<<"e="<<e<<"\n"; e = 3 cout<<"f="<<f<<"\n"; f = 0 cout<<&e; return 0; }lol ok 3 antworten XD such dir eine aus