Dynamische Speicherverwaltung
-
Hey mal ne allgemeine Frage zur Dynamischen Speicherverwaltung.
Folgender Code:
#include <iostream> #include <conio.h> using namespace std; int main() { int *iptr = new int; *iptr = 100; cout << *iptr << endl; cout << iptr << endl; cout << &iptr; delete iptr; _getch(); return 0; }So jetzt bekomme ich 3 Angaben:
100 (Wert von iptr [*iptr])
00614878 (Adresse von iptr ?!)
0039FDF8 (Direkte Adresse des Zeigers)Meine Frage: Wenn ich mit dem Adressoperator (&) die Adresse des Zeigers zurückgebe, warum hat dieser einen anderen Speicherplatz als iptr ? Im grunde zeigt der Zeiger doch auf sich selbst oder versteh ich da was falsch?

-
iptr ist selber eine Variable und hat damit natürlich eine eigene Adresse.
-
KPKK schrieb:
Meine Frage: Wenn ich mit dem Adressoperator (&) die Adresse des Zeigers zurückgebe, warum hat dieser einen anderen Speicherplatz als iptr ? Im grunde zeigt der Zeiger doch auf sich selbst oder versteh ich da was falsch?

Ja, das verstehst du falsch. Ein Zeiger ist eine eigene Variable mit eigenem Speicherplatzverbrauch. (Üblicherweise so groß wie ein int, aber das ist nicht zwangsläufig gegeben.)
Wo sollte man auch sonst den Wert des Zeigers abspeichern?
-
Hm, ja okay, aber warum gibt mir das Programm zwei verschiedene Adressen aus, wenn ich einmal iptr und einmal &iptr ausgebe. Oder ist das so, weil ich mit
int *iptr = new inteinmal Speicher für den Zeiger selbst und einmal Speicher fürs "int" anfordere?
-
Nein. Der Pointer wird auf dem Stack angelegt, wie jede andere normale Variable. Bei "int i;" wird ja auch Speicher reserviert, genau so funktioniert das auch mit "int *i;".
-
Ja das ist mir klar, nur frag ich mich, warum ich jetzt trotzdem 2 Adressen habe. Wenn es nur einen Zeiger gibt, dann sollte er doch eigentlich auch nur eine Adresse haben. Also iptr == &iptr.
-
KPKK schrieb:
Ja das ist mir klar, [...]
Sicher?
-
Ne nicht mehr

-
Sag mal, ist dir eigentlich klar was der Adressoperator macht und dass man ihn auch auf normale Variablen anwenden kann?
int i; std::cout << &i;
-
Mal ganz simpel auf einer Maschine mit einem Adressraum vom 8 Byte und ohne den ganzen Aufrufskram dargestellt:
+----------- &iptr | v +-----+ 1 | 5 | <- iptr +-----+ 2 | | +-----+ 3 | | +-----+ 4 | | +-----+ 5 | 100 | <- *iptr +-----+ 6 | | +-----+ 7 | | +-----+ 8 | | +-----+
-
KPKK schrieb:
Ja das ist mir klar, nur frag ich mich, warum ich jetzt trotzdem 2 Adressen habe. Wenn es nur einen Zeiger gibt, dann sollte er doch eigentlich auch nur eine Adresse haben. Also iptr == &iptr.
Du hast einen Zeiger, der auf eine Variable/was auch immer zeigt, demnach ist der Inhalt des Zeigers die Adresse der Variable (ptr == 00614878 <-- hier ist dein int gespeichert). Da der Zeiger bzw. sein Inhalt irgendwo gespeichert werden muss, wird er auf dem Stack abgelegt und bekommt eine Adresse zugewiesen (&ptr == 0039FDF8 <-- hier ist dein Zeiger gespeichert). *ptr == 100 ist klar.