Pointer, Übergabe an Methode/Funktion



  • Hey,

    kann mir einer sagen, was sich hier genau abspielt?

    string* psPointer=new string("Alt");
    
    cout << "\nCallByPointer: ";
    callByPointer(psPointer);
    cout << " " << *psPointer;
    
    [...]
    void callByPointer(string* psFunc)
    {
    	psFunc=new string("Neu");
    }
    

    Main:
    psPointer liegt auf 0x00321180, Inhalt ist irgendeine Adresse im Heap ab der "Alt" steht.

    callByPointer:
    psFunc ist 0x00321180, aber nach new ist psFunc 0x003211d8 mit "Neu". Nach der Rückkehr von callByPointer ist psPointer nach wie vor 0x00321180 und "Alt".

    Ausgabe ist also "Alt".

    Was passiert denn hier? Oder bin ich zu blöd den MSVS Debugger zu lesen?

    Ich hätte geschätzt, das psFunc psPointer innerhalb der Funktion darstellt, also dass "Neu" anschliessend auch durch psPointer dargestellt wird. Ist aber nicht so. Verstehe ich nicht, da muss was auf dem Stack passieren was mir entgeht.

    Gruß,
    xaoC



  • Du übergibst eine Zeiger auf String, d.h. Du kannst in deiner Funktion den Inhalt
    des Strings ändern.

    *psFunc="Neu";
    

    Hätte demgemäss zu dem von dir erwarteten Ergebnis geführt.

    In deiner Funktion jedoch wird versucht den Pointer selbst zu ändern und das
    geht nicht denn der Zeiger selbst wird als Kopie übergeben. Um den Zeiger
    zu ändern musst du den Parameter als Pointer auf Pointer übergeben.

    void callByPointer(string** ppsFunc)
    {
        *ppsFunc=new string("Neu");
    }
    


  • Hallo

    dann must du natürlich auch schreiben :

    string* psPointer=new string("Alt");
    
    cout << "\nCallByPointer: ";
    callByPointer(&psPointer);
    cout << " " << *psPointer;
    delete psPointer;
    [...]
    void callByPointer(string** ppsFunc)
    {
        delete *psFunc;
        *psFunc=new string("Neu");
    }
    

    Nur warum benutzt du dynamisch erstellte std::string und keine Referenzen?

    bis bald
    akari



  • Redhead schrieb:

    Du übergibst eine Zeiger auf String, d.h. Du kannst in deiner Funktion den Inhalt
    des Strings ändern.

    *psFunc="Neu";
    

    Hätte demgemäss zu dem von dir erwarteten Ergebnis geführt.

    In deiner Funktion jedoch wird versucht den Pointer selbst zu ändern und das
    geht nicht denn der Zeiger selbst wird als Kopie übergeben. Um den Zeiger
    zu ändern musst du den Parameter als Pointer auf Pointer übergeben.

    void callByPointer(string** ppsFunc)
    {
        *ppsFunc=new string("Neu");
    }
    

    Okay, das klärt's, Merci.



  • akari schrieb:

    Hallo

    dann must du natürlich auch schreiben :

    string* psPointer=new string("Alt");
    
    cout << "\nCallByPointer: ";
    callByPointer(&psPointer);
    cout << " " << *psPointer;
    delete psPointer;
    [...]
    void callByPointer(string** ppsFunc)
    {
        delete *psFunc;
        *psFunc=new string("Neu");
    }
    

    Nur warum benutzt du dynamisch erstellte std::string und keine Referenzen?

    bis bald
    akari

    Es war ein Test. Bin drüber gestolpert und wußte nicht was zum Ergebnis führte.
    Die Funktion macht herzlich wenig Sinn.

    Thx,
    xaoC


Anmelden zum Antworten