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


Anmelden zum Antworten