Verständniss-Problem mit Zeigern



  • Hallo,

    ich hab mir noch einmal eingehend "Zeiger bzw. pointer" in C++ angeschaut und steige einfach nicht dahinter, zu welchem Zweck die denn gut sind.
    Ich weiss, wie man auf diese zugreift bzw. diese funktionieren, aber eben nicht wie konkret, ich denn mal notwendigerweise auf die zurückgreifen muss..?!

    Was ich auch nicht verstehe ist dieses * vor einer Zeigervariable? Ist das notwendig, oder dient es lediglich dazu, dem Programmierer vorher schon klar zu machen, dass es sich hierbei um einen Zeiger handelt?



  • Ein Zeiger ist auch nur eine Variable, du brauchst den * operator,
    um auf den Inhalt auf den der Zeiger zeigt zugreifen zu können.

    Devil



  • Stell dir mal ne Funktion vor, die als Übergabeparameter einen Array braucht.

    z.B.

    int max_element(SOME_ARRAY)
    

    Wenn du jetzt den Array by-value (also jedes einzelne Element, z.B. 100.000 ints = 200 KB) übergibst, kopiert dein Prog den ganzen Array-Speicher (200 KB) so, dass ihn deine Funktion lokal bearbeiten kannst.
    Jetzt stell dir mal vor, du musst 1000 mal die größte Zahl aus einem 100.000 Array ermitteln, per Value würdest du also 200 MB Daten durch den Speicher rumkopieren.

    Deshalb gibts Pointer. Ein Array ist z.B ein Speicherbereich (0x00000 - 0x00100) ein Pointer (int* int_pt;) zeigt jetzt auf die erste Speicherzelle (0x0000)

    Diesen Pointer kannst du jetzt an Funktionen übergeben (Call-By-Reference!), jetzt werden nicht mehr 200 KB kopiert, sondern nur noch 1 Pointer...

    int max_element(int* array, int size)
    

    Fazit, wenn du nicht das ganze (große) Objekt verschicken willst, verschick einfach nen Pointer drauf.

    Hoffe, ein wenig geholfen zu haben. Neulich gabs nen Thread zu arrays, les mal den.



  • ok,

    danke schön.

    Ich denke, ich werd einfach mal verschiedene Beispiele mit Pointern programmieren, vielleicht steige ich dann ja besser dahinter...



  • bei der deklaration von zeigern benutzt man *

    wenn das anderweitig noch benutzt wird schaut man mit * auf das was in dem zeiger steht

    zb
    int i = *zeiger1 + *zeiger2;

    das kann sein eine zahl wenn man nen zeiger auf ein int hat

    oder es kann sein sein ne ganze klasse wenn man nen zeiger auf ne klasse hat
    den man zb mit einen typ (nichtzeiger) der selben klasse initialisieren will

    uebergibst du nen zeiger so an eine fkt

    void fkt (zeiger)
    {}
    

    dann wird die addresse uebergeben dh dass du die addresse in fkt manipulieren kannst und die information in dem zeiger nach beenden der funktion danach in der aufrufenden funktion noch vorhanden ist

    damit gibt man so viele werte zurueck wie man will und ist nicht mehr auf einen beschraenkt



  • schau mal hier nach, ist gut erklärt



  • Gast221212 schrieb:

    Wenn du jetzt den Array by-value (also jedes einzelne Element, z.B. 100.000 ints = 200 KB) übergibst, kopiert dein Prog den ganzen Array-Speicher (200 KB) so, dass ihn deine Funktion lokal bearbeiten kannst.

    Wie übergibst du denn einen Array by-value. 😕



  • Wie übergibst du denn einen Array by-value

    habs nicht ausprobiert aber würde mal stark vermuten wenn du so einen spass machst....

    for(int a[10000]){...}
    

    kopiert der das ganze scheiss teil und nicht nur den zeiger...
    zum anderen kannst du das ja auch analog für vectoren und co sehen... zwar wird der stack nicht gross zugemüllt aber dafür der heap wenn du einen richtig vollen std::vector übergibst und der erstmal den copy konstruktor aufrufen muss... (sowas sollte man mit explizit verbieten...)



  • enno-tyrant schrieb:

    schau mal hier nach, ist gut erklärt

    Vielen Dank (Ich hätte natürlich mal einen Blick in die FAQ's werfen können 🙄 ).

    Diese nette kleine Einführung lässt (für mich jedenfalls) keine Fragen mehr offen.



  • NewProggie schrieb:

    Was ich auch nicht verstehe ist dieses * vor einer Zeigervariable? Ist das notwendig, oder dient es lediglich dazu, dem Programmierer vorher schon klar zu machen, dass es sich hierbei um einen Zeiger handelt?

    Genau, ein * soll dem Programmierer bzw. auch dem Compiler sagen: das ist ein Pointer. Das ist aber nur für die Deklaration und Dereferenzierung nötig. Wenn du den Pointer mit * deklariert hast, arbeitest du natürlich ohne * damit weiter.

    Der Sinn und Zweck des Pointers ist ganz einfach: Zeige (auf engl. "point") auf eine Speicherstelle im RAM. Pointer heißt Zeiger.

    Kannst du englisch? Dann zieh dir einfach mal dieses gut gemachte Video über Pointer rein:

    http://www.cs.stanford.edu/cslibrary/PointerFunCpp.avi (14 MB)

    http://www.cs.stanford.edu/cslibrary/PointerFunCppBig.avi (34 MB)

    DAS Video muß man kennen! 😃 👍



  • @artchi
    rofl das ist wirklich lustig... 😃



  • Chew-Z schrieb:

    Gast221212 schrieb:

    Wenn du jetzt den Array by-value (also jedes einzelne Element, z.B. 100.000 ints = 200 KB) übergibst, kopiert dein Prog den ganzen Array-Speicher (200 KB) so, dass ihn deine Funktion lokal bearbeiten kannst.

    Wie übergibst du denn einen Array by-value. 😕

    Trickreicherweise is mein "SOME_ARRAY" eine eigene Klasse. Jedoch war das nur ein Beispiel, wieso man große Objekte by-Reference übergeben sollte.

    was macht denn der Compiler wenn du so einen Code hast (Falls der überhaupt compiliert)?

    void func(int[10000] array)
    

Anmelden zum Antworten