Ws ist eigentlich der Sinn von Zeiger?



  • http://www.kharchi.de/cppratgeber1.htm#vor_und_nachteile

    Was hat diese Site mit Zeiger zu tun?

    Was ist mit dynamischer Speicherreservierung gemeint? Kann man damit Variablen mehr Speicher zuteilen?

    MfG CSS



  • @CSS: Wie wärs damit den Originalaccount auch für Fragen zu benützen? Haben dir die verschiedenen Beispiele jetzt schon geholfen oder benötigst du noch mehr Informationen?

    MfG SideWinder



  • ... lol



  • @SideWinder
    Bin in einem I-Cafe.

    MfG CSS



  • Danke für eure Infos, aber ich verstehe noch immer nicht was dynamsiche Speicherreservierung bedeutet.

    MfG CSS



  • // statische speicherreservierung
    double d; // statisch einen double aneglegt, wir benötigen aber mindestens 10
    double d[10]; // okay gut, was aber nun wenn der user dem programm in den optionen sagt er möchte gerne 11?
    double d[input]; // funktioniert nicht, stattdessen
    
    // dynamische speicherreservierung
    double* d = new double[input];
      // mach was damit
    delete[] d;
    

    Ziemlich einfachers und einfallsloses Beispiel, aber man kann natürlich noch viel mehr damit machen (Listen, Bäume, etc.).

    MfG SideWinder



  • Zeiger schrieb:

    Was hat diese Site mit Zeiger zu tun?

    Der Platz auf dem Stack, wo variablen normalerweise erzeugt werden, ist begrenzt und zeiger erlauben einem den zugriff auf den heap, der im vergleich dazu gigantisch groß ist.

    Was ist mit dynamischer Speicherreservierung gemeint? Kann man damit Variablen mehr Speicher zuteilen?

    wenn du beim programmieren noch nicht weißt wieviel speicher du brauchst, musst du dynamisch speicher allokieren, also je nach bedarf.
    die größe der arrays kann so groß sein wie du willst (mehr oder weniger).

    beispiel:

    #include <iostream>
    
    using std::cout;
    using std::cin;
    
    int main()
    {
        int size; 
    
        cout << "Speichergroesse: ";
        cin >> size;
        char* pMemory = new char[size];
    
        cout << size * sizeof(char) << " Byte Speicher reserviert!\n";
    
        delete [] pMemory;
    
     return 0;
    }
    

    mfg



  • das bedeutet du hast die kontrolle ueber deinen Speicher
    du kannst ihn abheben, erweitern und wieder freigeben wann du willst zb:

    void foo()
    {
       int i[20]; // temporaer, hier lässt sich nicht viel machen
       int *pi = malloc (20);
    
       // tu was mit pi, und i
    
       // ach scheise ich brauch mehr speicher .. 
       pi = realloc(pi, 100);
    
       // so jetzt brauch ich pi nicht merh
       free(pi); // und tschues
    
       // mache weitere sachen mit i
    
    } // i wird zerstoert
    

    ups sry code ist jetzt c..

    ein typisches bsp fuer die Verwendung von Zeigern, also dort wo sie unverzichtbar sind ist zb verlinkte datenstrukturen wie die std::list(STL)



  • Wozu Zeiger?

    Wenn Du schon einmal mit irgendeinem Zeichen- oder Grafikprogramm ein Bitmap auf Festplatte gespeichert hast, kannst Du leicht feststellen, wieviele Kilobyte bzw. Megabyte so ein einzelnes Bilchen an Speicher auf Deiner Festplatte belegt. 100 kB oder mehr sind da schnell ein mal verbraucht.
    Nehmen wir weiters an, Du möchtest ein Programm schreiben, in dem mehrere Objekte, die auf dem Bildschirm ausgegeben werden, genau gleich aussehen (also dass ein und dasselbe Bitmap an verschiedenen Positionen auf dem Bildschirm zu sehen ist.) Damit diese Bitmaps überhaupt auf die Bildschirmoberfläche (Primary Surface) geblittet (gezeichnet) werden können, müssen sie erst irgendwo im Speicher existieren (Hauptspeicher oder Grafikkartenspeicher). Jetzt wäre es natürlich möglich, für jedes einzelne Objekt ein extra Exemplar ein und desselben Bitmaps in den Speicher zu laden. Das wäre aber natürlich eine sinnlose Vergeudung von Speicher, da beim Blitten eines Bitmaps ohnehin nur lesend auf den Speicherbereich, an dem sich das Bitmap befindet, zugegriffen wird. Anstatt ein und das selbe Bitmap für jedes Objekt extra in den Speicher zu laden, und damit sinnloser Weise viel zu viel Speicher zu verbrauchen, begnügt man sich damit, das Bitmap nur ein einziges Mal in den Speicher zu laden, und dafür jedem Objekt, dessen Repräsentation auf dem Bildschirm diese eine Bitmap sein soll, nur einen Zeiger auf dieses eine Bitmap zu geben, über den das Bitmap auch ausgegeben werden kann.

    Man kann mit Zeigern unglaublich viel Speicher sparen, der für alles mögliche andere sinnvoller eingesetzt werden könnte.

    Ein weiterer Einsatzbereich von Zeigern ist das Arbeiten mit Dateien. Es ist völlig unmöglich, einer irgendwo auf einer Festplatte existierenden Datei einen bestimmten, in C++ vordefinierten Datentyp mit ebenso vordefinierter Datentypgröße 'andichten' zu wollen. Normalerweise ist eine Datei einfach eine endlose Reihe von Bytes, die beim Dateiendezeichen endet. Innerhalb einer Datei kann man sich nur mit Zeigern bewegen (eines Tages stolpert jeder über Funktionen wie SetFilePointer etc).

    Kurz: Zeiger haben immer irgendetwas mit Speicher zu tun (entweder Sparen von Speicher, Bewegen innerhalb von Speicher ...). (Kein Wunder, eigentlich sind sie ja nur long oder LARGE_INTEGER Werte, die die Adresse irgendeines Bytes irgendwo anders im SPEICHER SPEICHERN.

    Genug, ganz ehrlich, anfangs war mir auch nicht ganz klar, wozu ich Zeiger brauchen konnte, aber vorweg: jeder C++ Programmierer braucht sie früher oder später.

    (Na, wie war meine Anekdote?)



  • Zeiger sind zum Zeigen da. Punkt.


Anmelden zum Antworten