Ws ist eigentlich der Sinn von Zeiger?
-
Ich weiß, dass meine Frage in jedem Buch bzw. Tutorial beantwortet ist, doch habe ich den Sinn von Zeigern bzw. Referenzen nicht verstanden. Was nützt es mir, einen Alias Namen einer Variable zu haben oder die Adresse einer Variable?
Vielleich könnter ihr mir das erklären? (bitte)
MfG Zeiger
-
Ein wesentlicher Vorteil ist die dynamische Speicherverwaltung, da
du vor Programmazsführung selten weißt, wieviel Arbeitsspeicher dein
Programm noch brauen wird. Also reservierst du dir Speicher. Um auf ihn zuzugreifen, brauchst du Zeiger.Und ließ mal die Begriffe call-by-value und call-by-reference nach.
Edit: Nicht zu vergessen so tolle Dinge wie Listen, Bäume, Funktionspointer, Strings und und und
-
-
- Dynamischer Speicher
- Damit sind dynamische Datenstrukturen möglich
- Zeiger auf Objekte (Wenn du dich etwas mehr mit objektorientierter Programmierung in C++ auseinandergesetzt hast weist du dir da Zeiger helfen können)
- Um einen größeren Speicherbereich zu übergeben musst du nur noch die Anfangsadresse und (je nach dem in welchem Bereich du dich bewegst) die Größe des Speichers angebenMfG SideWinder
-
Artchi schrieb:
Dadurch wird er es sicherlich nicht verstehen.
-
man kann sich das so vorstellen zb:
du verwendest "Dinge"(Objekte) und "adressen"(Adressen) im taeglichen leben.
du lebst in einem Haus (einem Ding). Die Adresse ist vielleicht
Waldstraße 18. Eine Adresse ist recht klein und kann auf ein Stueck Papier geschriebn werden. Ein Haus auf einem Stueck Papier unterzubringe ist schon schwerer, erfordert viel Arbeit bzw einen großen Kran.Adressen(Zeiger) haben imer ungefaehr dieselbe Groeße. obwohl beide adressen dieseble groesse haben, kann Waldstraße 18 auf eine große villa oder auf ein kleines Einfamilienhaus verweisen.
mit zeiger kann zb: schnell und einfach auf arrays zugegriffen werden. oder komplexe datenstrukturen erstellt werden, sie sind auch unverzichtbar fuer die dynamischen speicherverwaltung
mittels Zeiger erhaelt man indirekten Zugriff auf Objekte, (fuer sehr große objekte sehr hilfreich)
-
ein zeiger erlaubt dir arrays beliebiger größe zu allokieren* und wird benötigt, wenn du größere objekte auf dem Heap ablegen willst. außerdem kann man damit auf funktionen zeigen, um sich z.b. if-abfragen zu ersparen.
referenzen werden meist dazu benutzt CopyCtor-Aufrufe zu vermeiden, indem man einfach const references übergibt. (hier gibt es doch noch mehr verwendungen?)
zeiger und referenzen werden auch benutzt, wenn eine funktion mehrere werte zurückgeben soll (schlechtes design?), wobei der vorteil der referenzen darin liegt, dass der aufrufer einer funktion weiterhin einfach nur die argumente übergeben muss.
mfg
* (die stl macht das mit std::vector und konsorten zum größten teil überflüssig.)
-
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.