Was nützen *Pointer?



  • C++Progger schrieb:

    aber dass Experten sie lieben.

    das war vermutlich einer, der erst seit 3 jahren c++ kann und sich als experte fühlt. keine bange, wenn der erste entdeckerstolz verraucht ist, wird er wieder umschwenken und pointer und referenzen meiden (außer in trivialen fällen wie übergabeparameter auf 4 bytes schrumpfen).



  • volkard schrieb:

    wird er wieder umschwenken und pointer und referenzen meiden

    Sind Referenzen inzwischen auch der Teufel?

    EDIT: Quote tag korrigiert



  • gi, ja mit referenz auf pointer habe ich dann ja call by reference, nur mit pointer call by value...vielleicht machts deshalb sinn?;)

    wie kann ich einen pointer als referenz aus einer funktion zurückgeben?



  • GPC schrieb:

    volkard schrieb:

    wird er wieder umschwenken und pointer und referenzen meiden

    Sind Referenzen inzwischen auch der Teufel?

    ob du ne dynamische datenstruktur mit pointers oder mit referenzen machst, ist egal. tücken.
    ob du call by ref oder call by pointer machst, ist auch egal. keine tücken.
    mir ist rect egal, ob ich zum benutzen des bezeichners ein * davorschreibe oder ob der das im geheimen automagisch selber macht. das ist nur syntax und praktisch irrelevant bei der teufelfrage.
    es ist nicht so, daß referenzen irgend einen vorteil gegenüber zeigern hätten. beide sind gleichermaßen praktisch und gefährlich.



  • ptr schrieb:

    wie kann ich einen pointer als referenz aus einer funktion zurückgeben?

    //ungetestet und bestimmt nicht ganz korrekt
    class List{
    private:
    struct Node{
    double d;
    Node* n; 
    };
    Node* a;//aka anchor,root,head
    Node*& findPlaceToInsertOrReplace(double x){
       for(Node**p=&a;*a;p=&(*p)->n)
          if((*p)->d==x)
             return p;
       return &a;
    }
    ...
    


  • int* foo::operator->() 
     { 
          return &(ptr->val); 
     }
    

    mit &(ptr->val) bekomm ich die adresse?

    for(Node**p=&a;*a;p=&(*p)->n)

    schau verwirrent aus;)

    Node*& findPlaceToInsertOrReplace(double x){
        ...
        return &a;   <--- adresse des pointers?
    }
    

    du sagst die adresse ist *& ?



  • Soweit ich weiss ist

    Meine_Klasse* &Instanz;
    

    dasselbe wie

    Meine_Klasse Instanz;
    


  • Bei nem Objekt a ist*&a das gleiche wie a.
    Aber nicht bei Typen:

    A a = ...; -> a ist Objekt vom Typ A.
    A *& a = ...; a ist Referenz auf Pointer auf Objekt vom Typ A.

    edit: btw. volkard: in Deiner for-Schleife kommt mir das *a als Bedingung komisch vor, soll das vielleicht *p heißen?



  • ne frage (klink mich mal einfach so ein 🙂 ):

    Wenn ich zb schreibe

    zeiger1=zeiger1/zeiger2 wird da die variable auch überschrieben oder nur der Zeiger?



  • Jester schrieb:

    edit: btw. volkard: in Deiner for-Schleife kommt mir das *a als Bedingung komisch vor, soll das vielleicht *p heißen?

    jo, klar.



  • Was meinst Du mit dem /?
    Generell kann man aber sagen: Wenn Du einen Zeiger veränderst, dann verändert sich auch nur dieser. Wenn Du dereferenzierst, dann kannst Du das Objekt verändern auf das gezeigt wird. Dadurch ändert sich aber der Zeiger nicht (es sei denn er zeigt auch sich selbst oder ähnliche Konstruktionen).



  • ptr schrieb:

    [cpp]
    Node*& findPlaceToInsertOrReplace(double x){
        ...
        return &a;   <--- adresse des pointers?
    }
    

    ups, da war wohl return a; gemeint (und entsprechend return *p).
    normalerweise verwende ich zeiger auf zeiger für sowas und unten return 0; statt return a;



  • mit dem "/" meine ich einen divisions operator ^^



  • ich versteh folgende 2 kontrukte noch nicht;/

    int* foo::operator->() 
    { 
           return &(ptr->val); 
    }
    

    mit &(ptr->val) bekomm ich die adresse?

    Node*& findPlaceToInsertOrReplace(double x){ 
         ... 
         return &a;   <--- adresse des pointers? 
    }
    

    adresse auf referenz auf pointer? wie sagt man dass;)
    wie muss hier noch der funktionsaufruf aussehen?
    ...bei nem array weiss ich auch das ein arr[i] das gleich ist wie ein *&arr[i]



  • asking a question schrieb:

    mit dem "/" meine ich einen divisions operator ^^

    Man kann Zeiger nicht durcheinander teilen.



  • ptr schrieb:

    wie muss hier noch der funktionsaufruf aussehen?

    ich denke da an sowas:

    Node*& t=findPlaceToInsertOrReplace(3.14);
    t=new Node(t->next,2.71);
    

  • Administrator

    Jester schrieb:

    asking a question schrieb:

    mit dem "/" meine ich einen divisions operator ^^

    Man kann Zeiger nicht durcheinander teilen.

    Wieso nicht?

    CObject *pOne, *pTwo; // Zwei Zeiger
    int x = reinterpret_cast<int>(pOne);
    int y = reinterpret_cast<int>(pTwo);
    int r = x / y;
    CObject *pResult = reinterpret_cast<CObject*>(r);
    

    Wird bis auf ein paar Warnmeldungen und einigen seltsamen Blicken aktzeptiert. Der Verwendungszweck dabei bleibt mir allerdings auch schleierhaft ^^

    Grüssli



  • Und jetzt zeig mir bitte noch die Zeile in dem Beispiel in der Du zwei Zeiger teilst 😃


  • Administrator

    LordJaxom schrieb:

    Und jetzt zeig mir bitte noch die Zeile in dem Beispiel in der Du zwei Zeiger teilst 😃

    Man nicht so pingelig ^^ ... ich teile den Wert der Adresse. Ob jetzt die Adresse in einem Integer gespeichert ist oder in einem Pointer spielt ja nicht so eine grosse Rolle. Die Zahl/Der Wert dahinter sollte gleich bleiben ^^

    Grüssli



  • sorry, was ich meinte war viell kann ich zb ne iteration machen ohne die variable zu überschrieben und ne anderen zu verwenden sorich mit zeigern.


Anmelden zum Antworten