Was nützen *Pointer?



  • 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.



  • Dravere schrieb:

    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 ^^

    Strenggenommen ist nichtmal garantiert, dass Dein Pointer in einen signed int überhaupt reinpasst (spätestens bei x64 unter VC++ ist das imho nicht mehr der Fall). Und selbst wenn, würden die unsigned Adressen im signed int wenn das höchstwertige Bit gesetzt ist nicht so teilen, wie Du vermutlich erwartest 😉


  • Administrator

    dann nehmen wir halt

    __int64
    

    Aber mir ist schon klar, dass es eigentlich nicht so ganz dasselbe ist. Aber es ist ja auch unnötig darüber weiterzudiskutieren, da es völliger Quatsch ist ^^

    @ "asking a question"
    Inkrementieren eines Pointers geht. Bzw. auch dekrementieren. Also:

    int *p; // Einen Zeiger
    ++p; // Funktioniert
    --p; // Funktioniert auch
    

    Grüssli



  • volkard schrieb:

    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).

    😕
    Pointer = Indirektion = extrem wichtiges Mittel in der Programmierung. Irgendwie erscheint mir das Verständnis von Pointern (und damit meine ich jetzt nicht unbedingt die konkrete C-Inkarnation) *extrem* wichtig zu sein und man sollte schon gut unterscheiden zwischen der sinnlosen Verwendung von Pointern in C++ (dynamische Objektallokation statt Stackobjekte, zuviele nackte Pointer, Arrays statt Container, keine Referenzen...) und der sinnvollen Anwendung des Pointer-Konzepts (z.B. in Datenstrukturen und Algorithmen).



  • akari schrieb:

    Hallo

    Pointer braucht man bei dynamischer Speicherverwaltung.

    bis bald
    akari

    ... und, wenn man Laufzeit-Polymorphie nutzen will (sprich: Ausnutzen, dass man einen "Mercedes" wie jedes andere "Auto" behandeln kann). 😉
    (Geht mit Referenzen natürlich genauso)

    Gruß,

    Simon2.


Anmelden zum Antworten