Was bringen mir Pointer?



  • Hallo.
    Ich bin noch ein Anfänger und schaff es einfach nicht zu verstehen, wozu Pointer gut sind. Man kann sie doch eigentlich immer umgehen, z.B. durch Referenzen oder um den Inhalt von Arrays zu bekommen kann man sie doch einfach indizieren...

    Also gibt es einen Bereich wo man sie einsetzen muss und nicht umgehen muss?

    Ich habe schon bei Google und hier im Forum gesucht, aber nichts passendes gefunden.

    Gruß Speedy_92



  • * Pointer ermöglichen es, das Funktionen ihre beim Aufruf übergebenen Variablen verändern können

    * dynamische Verwaltung von Speicherplatz, memory managment, funktioniert immer über Pointer

    * wenn man sein Programm optimieren will, Geschwindigkeit, Speicherbedarf sind Pointer immer sehr beliebt



  • gab nicht vor kurzem schon mal so nen thread? 🙄



  • Such mal hier im Forum nach einer beliebigen Kombination von (wozu oder wofür oder warum oder bringen oder weshalb) und (pointer oder zeiger).



  • Zeigerarithmetik.



  • XaTrIxX schrieb:

    * Pointer ermöglichen es, das Funktionen ihre beim Aufruf übergebenen Variablen verändern können

    * dynamische Verwaltung von Speicherplatz, memory managment, funktioniert immer über Pointer

    * wenn man sein Programm optimieren will, Geschwindigkeit, Speicherbedarf sind Pointer immer sehr beliebt

    zu 1.: das kann man doch auch mittels Referenzen machen ?!

    zu 2.: was bringt denn eigentlich die verwaltung von Speicherplatz? wieso lässt man das nicht Windows machen?

    zu 3.: das wusste ich noch nicht.

    danke schon einmal



  • ultimativer tipp: kauf ein gutes lehrbuch, wie jeder andere vernünftige mensch auch.



  • Speedy_92 schrieb:

    zu 1.: das kann man doch auch mittels Referenzen machen ?!

    Ja, aber eine Referenz muss auf ein Objekt zeigen, während Zeiger auch NULL sein können.

    Speedy_92 schrieb:

    zu 2.: was bringt denn eigentlich die verwaltung von Speicherplatz? wieso lässt man das nicht Windows machen?

    Letztendlich macht das auch das Betriebssystem, aber was geben dir malloc und new denn zurück? Genau, eine Adresse des neuen Speicherbereichs, die du nur einem Zeiger zuweisen kannst.



  • kreater schrieb:

    ultimativer tipp: kauf ein gutes lehrbuch, wie jeder andere vernünftige mensch auch.

    Ich habe ein vernünftiges Buch: C++ Primer

    Nur daraus werde ich auch nicht schlau.



  • 🙄 kreater schrieb:

    gab nicht vor kurzem schon mal so nen thread? 🙄

    Die gibts fast so oft wie C++ vs. Java



  • Speedy_92 schrieb:

    Ich habe ein vernünftiges Buch: C++ Primer
    Nur daraus werde ich auch nicht schlau.

    Das Problem von vielen Büchern scheint zu sein, dass sie nicht vermitteln können, wann und warum man Konstrukte wie Zeiger und Klassen benötigt.
    Am besten ist, du bastelst selbst an kleineren Projekten und behälst im Hinterkopf, dass es Dinge wie Zeiger und Klassen gibt. Irgendwann merkst du dann: hier wär so ein Zeigerchen jetzt recht nützlich. Damit erschließt sich dir das Ganze von selbst.



  • Alles klar. Vielen Dank.
    Also mit KLassen komm ich super klar und verstehe auch wo ich sie einstezen muss. Problem sind halt nur die scheiß Pointer.



  • @Speedy_92:
    Stell dir vor, du musst eine RIESSENGROSSE Variable an eine Funktion weiterschicken...dann legt die Funktion für diese RIESSENGROSSE Variable auch noch eine Kopie an
    -> Folgen: enorme Speicherplatzbelegung + schlechtes Laufzeitverhalten
    Mit dem Verwenden eines Pointers jedoch arbeitet die Funktion letztlich nur mit der Adresse zu dieser RIESSENGROSSEN Variable und kann diese zusätzlich auch noch verändern!

    Grüße
    Gapa



  • Gapa schrieb:

    @Speedy_92:
    Stell dir vor, du musst eine RIESSENGROSSE Variable an eine Funktion weiterschicken...dann legt die Funktion für diese RIESSENGROSSE Variable auch noch eine Kopie an
    -> Folgen: enorme Speicherplatzbelegung + schlechtes Laufzeitverhalten
    Mit dem Verwenden eines Pointers jedoch arbeitet die Funktion letztlich nur mit der Adresse zu dieser RIESSENGROSSEN Variable und kann diese zusätzlich auch noch verändern!

    Schlechtes Beispiel da hier gerade auch Referenzen sinnvoll sind (und Referenzen sollte man den Zeigern vorziehen, solange es nicht andere Gründe für Zeiger gibt).

    Was ist also der Vorteil von Zeigern:
    a) Bei der dynamischen Speicherverwaltung unabdingbar (Wenn du vorher noch nicht weißt wie viele Datensätze du hast, z.B. bei einem Adressbuch). Arrays helfen hier nicht weiter da sie eine fixe Größe haben, was in solchen Fällen meist nicht sinnvoll ist.
    b) Übergaben wo ein Wert optional ist (NULL/0-Übergabe)
    c) Polymorphie in Listen (Referenzen kann man nicht in Listen halten)
    ...

    cu André
    P.S: Und JA, Speedy_92, kauf dir ein sinnvolles Buch wie den C++ Primer



  • asc schrieb:

    Gapa schrieb:

    @Speedy_92:
    Stell dir vor, du musst eine RIESSENGROSSE Variable an eine Funktion weiterschicken...dann legt die Funktion für diese RIESSENGROSSE Variable auch noch eine Kopie an
    -> Folgen: enorme Speicherplatzbelegung + schlechtes Laufzeitverhalten
    Mit dem Verwenden eines Pointers jedoch arbeitet die Funktion letztlich nur mit der Adresse zu dieser RIESSENGROSSEN Variable und kann diese zusätzlich auch noch verändern!

    Schlechtes Beispiel da hier gerade auch Referenzen sinnvoll sind (und Referenzen sollte man den Zeigern vorziehen, solange es nicht andere Gründe für Zeiger gibt).

    Was ist also der Vorteil von Zeigern:
    a) Bei der dynamischen Speicherverwaltung unabdingbar (Wenn du vorher noch nicht weißt wie viele Datensätze du hast, z.B. bei einem Adressbuch). Arrays helfen hier nicht weiter da sie eine fixe Größe haben, was in solchen Fällen meist nicht sinnvoll ist.
    b) Übergaben wo ein Wert optional ist (NULL/0-Übergabe)
    c) Polymorphie in Listen (Referenzen kann man nicht in Listen halten)
    ...

    cu André
    P.S: Und JA, Speedy_92, kauf dir ein sinnvolles Buch wie den C++ Primer

    Vielen Dank, aber schau mal ein paar Beiträge vorher... dort habe ich gerade geschrieben, das ich den C++ Primer schon besitze 😉

    Zu Punkt a) Wenn man die Anzahl der Datensätze noch nicht weiß dann kann man doch einfach Vektoren anstatt Arrays nehmen. Dann brauch ich ja wieder keine Pointer.



  • Speedy_92 schrieb:

    Zu Punkt a) Wenn man die Anzahl der Datensätze noch nicht weiß dann kann man doch einfach Vektoren anstatt Arrays nehmen. Dann brauch ich ja wieder keine Pointer.

    Und nun rate mal was Vektoren intern machen?
    Richtig! Mit Pointern arbeiten.

    Ja, man kann teilweise ohne Pointer arbeiten weil die STL dies im Hintergrund für einen erledigt, aber ohne Zeiger würde vieles aus der STL nicht laufen.

    Aber spätestens falls du ein modernes Vektorprogramm baust, brauchst du sie wieder: Nehmen wir mal an du möchtest beliebige grafikobjekte verwenden, und diese auf gleiche Art ansprechen (z.B. könnte jedes Grafikobjekt eine Methode "move" haben). Dazu Arbeist du mit einer Klassenhierachie (abstraktes Grafikobjekt, darunter die konkreten Klassen). Und nun müssen diese auch über eine Liste verwaltet werden. Tja, wie stopft man Objekte die eine gleiche Basisklasse haben und über polymorphie arbeiten in einen Container?

    Das Basisobjekt kannst du nicht verwenden (Dann würde der spezielle Teil "abgeschnitten" werden), Referenzen lassen sich auch nicht in vectoren speichern. Zeiger (und Smartpointer) wiederum haben das Problem nicht.

    cu André



  • Implementier einfach mal eine verkette Liste (ja, es gibt std::list, aber einmal im Leben sollte man mal eine verkette Liste implementiert haben) und du wirst verstehen was ein Pointer ist und wozu man ihn braucht.

    Es gibt nämlich Fälle, in denen std::list und std::vector, bzw. auch der Rest der Standardbibliothek nicht mehr ausreichen, in denen du exotisch anmutende Baumstrukturen abstrahieren musst.

    Oder, um einige Vorredner zu vervollständigen: Zeiger können 0 sein. Im letzten "Was sind Pointer und wofür sind sie gut"-Thread gab es dazu ein nettes Beispiel:

    class Car {
    private:
        Owner *m_owner;
    public:
        Car(Owner* owner);
    };
    
    // ...
    Car c1(NULL); // <-- KEIN besitzer; ein Zeiger kann 0 sein
    Owner o("me");
    Car c2(&o); // <-- erklärt sich wohl von selbst...
    

    Und wenn du irgendwann einmal planst über 32-Bit Intel-Architekturen und Windows hinaus zu programmieren, abseits der Anwedungsentwicklung gen Systemprogrammierung, wirst du wohl kaum ohne Zeiger auskommen. 😉



  • Alles klar. Vielen dank. Ich mache mich dann mal an die Arbeit, was die Liste angeht 🙂


Anmelden zum Antworten