Zeiger wiederspruch?
-
Hallo
also ich lern gerade mit dem buch "jetzt lerne ich c++" zeiger.
am anfang der kapitels stnad "Achtung! der eigentliche "aha"-Effekt kommt erst später im Laufe des Kapitels" oder so ähnlich. Aber als ich das Kapitel zu Ende gelesen habe hatte ich kein "aha"-Effekt sondern fühlte mich verwirrt.also es wird ja gesagt dass der vorteil von zeigern ist, dass sie nach der Rückkehr einer funktion bestehen bleiben.
und auf seite 181 steht folgendes: "denken Sie daran, dass der Zeiger selbst im Gegensatz zum Speicher, auf den er zeigt, eine Lokale variable ist."also nun zu meinem problem:
wenn das als lokale variable angesehen wird. dann wird ja nach dem verlassen der funktion der stack gelöscht somit auch die adresse die auf den speicherberreich zeigt.
und irgendwo in diesem kapitel wurde gesagt dass es keine möglichkeit gibt auf den speicherberreich zuzugreifen wenn die adresse verloren geht z.B. nach einer neuen zuweisung. zumindest hab ich das so verstanden.bin ich nun total bekloppt? wozu dann zeiger? die sind ja dann nicht besser als eine normale lokale variable, weil wenn die adresse verloren geht, nähmlich wenn die funktion verlassen wird, dann kann man nicht mehr auf den zugewiesenen wert zugreifen und der hängt da nur irgendwo in de luft.
bitte euch um aufklärung
mfg SIDEX
-
SIDEX schrieb:
also ich lern gerade mit dem buch "jetzt lerne ich c++" zeiger.
Das Buch soll ganz gut sein.
also es wird ja gesagt dass der vorteil von zeigern ist, dass sie nach der Rückkehr einer funktion bestehen bleiben.
Öhm, wird das da wirklich gesagt? Kann ich mir kaum vorstellen. Das ist jedenfalls Murks.
und auf seite 181 steht folgendes: "denken Sie daran, dass der Zeiger selbst im Gegensatz zum Speicher, auf den er zeigt, eine Lokale variable ist."
Ja, Zeiger sind nicht magisch, sondern einfach nur Werte, die eben einen Zeigertyp als Datentyp haben. Wenn du einen Zeiger als lokale Variable anlegst, hört er beim Verlassen des umschließenden Blockes (der Funktion) auf zu existieren.
bin ich nun total bekloppt? wozu dann zeiger? die sind ja dann nicht besser als eine normale lokale variable, weil wenn die adresse verloren geht, nähmlich wenn die funktion verlassen wird, dann kann man nicht mehr auf den zugewiesenen wert zugreifen und der hängt da nur irgendwo in de luft.
siehe oben. Ob etwas ein Zeiger ist oder nicht, hat überhaupt gar nichts damit zu tun, wie lange es im Speicher bestehen bleibt. Der "Trick", von dem hier wahrscheinlich die Rede sein sollte, ist, dass Zeiger unabdingbare Voraussetzung für das Arbeiten mit dynamischen Objekten ist.
Mal kurz die Speicherklassen rekapitulieren. 1) Lokale Variablen. Eigentlich heißt die Speicherklasse "automatisch". Weil diese Variablen nur in ihrem Block existieren, und bei Verlassen automatisch zerstört werden. 2) Statisch. Das betrifft alle globalen Variablen und solche, die als static deklariert wurde. Sie existieren während der gesamten Programmlaufzeit.
Dazu kommen jetzt noch dynamische Objekte. Die erzeugst du mit dem new-Operator, und zerstörst sie mit delete. Und hier kommen die Zeiger ins Spiel:int *p = new int(10); // ein neues int mit dem Wert 10 dynamisch erzeugen // hier mit *p arbeiten delete p; // zerstören
Das Objekt, auf das p zeigt, existiert genau bis zum delete. Egal, was p zwischendurch macht. Auch wenn p eine lokale Variable ist, und schon lange nicht mehr existiert, existiert das dyn. Objekt immer noch. Hauptsache, du hast dir die Adresse (also eine Kopie von p) irgendwo gesondert gemerkt .. sonst => Speicherleck.
Ach ja, das ist nicht alles, was man mit Zeigern anstellen kann, aber ich denke darauf lief dein Problem hinaus.
-
EDIT: Doppelt verwirrt nur *g*
-
Ich kenn das Buch nicht, bin aber mit dem Buch May: Grundkurs Software-Entwicklung mit C++ sehr gut gefahren. Da war alles erklärt, was ich über Zeiger wissen wollte - und das viel besser als bei anderen. Also - viel Spass.