PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pointer-Frage


MadMan2k
2006-09-20, 01:02:03
ist das folgende Diagramm vereinfacht?
http://www.cplusplus.com/doc/files/11-imgpoin1.gif

sprich, wie genau passiert die zuordung Variablen-Name->Speicher-Adresse->Speicher-Inhalt.

ich würde tippen dass das Tupel (variablen-name, Speicher-Adresse) ist im CPU-Register.
Dabei Stelle ich mir die adresse als Blockzahl, die dann "irgendwie" abgezäht wird.

Demnach wäre aber logischer, wenn ein Pointer einfache in weiteres Tupel im Register wäre anstatt wie im Diagramm der Inhalt eines Speicherblocks. :confused:

edit: ok meine version sit wohl die falsche, denn arrays kann man damit net mehr erklären.

Trap
2006-09-20, 01:34:34
Ich versteh das Diagramm nicht, was soll man darauf sehen?

sprich, wie genau passiert die zuordung variablen-Name->Speicher-Adresse->Speicher-Inhalt.
Es kommt drauf an was der Compiler draus macht.

Üblicherweise werden Variablennamen schon beim Compilieren entsorgt und nurnoch mit Adressen gearbeitet. Da gibts dann nurnoch 2 Arten von Daten, welche die im Speicher liegen und eine Adresse haben und welche die nur im Register existieren. Bei den Daten im Speicher braucht man halt die Adressen dazu in den Registern.

maprie
2006-09-20, 01:35:17
Variablennamen sind nur Speicheradressen in einem für Menschen leslichen Stil. Beim Kompilieren werden Speicheradressen daraus. Der Prozessor rechnet nur mit Zahlen.
In dem Bild steht also andy für die Adresse 1776 und hat den Wert 25. Wird die Variable normal an eine andere übergeben (fred = andy) entspricht das einem kopieren des Wertes. Durch '&' wird die Speicheradresse der Variable übergeben (ted = &andy), ted enthält dann als Wert die Adresse von andy.
Bei fred = andy lädt der Prozessor den Wert bei Adresse 1776 in ein Register und schreibt ihn dann an die Adresse von fred.
Bei ted = &andy kann der Prozessor normalerweise die Adesse von andy in einem Befehl nach ted schreiben, da die Adresse von andy beim Kompilieren festgelegt wurde.

Neomi
2006-09-20, 01:42:55
Ein Pointer ist eine Variable, in der eine Adresse steht, nicht mehr und nicht weniger. Eben genau so, wie in einer Integer-Variable eine Zahl steht. Ein Pointer hat auch keine wirkliche Zuordnung zu "seinem" vermeintlichen Inhalt (zu dem, worauf er zeigt), denn sein Inhalt ist nur eine Adresse, nicht die dort hinterlegten Daten.

PS: Variablennamen stehen nicht in CPU-Registern, sie sind noch nicht mal im Programm enthalten. Variablennamen existieren nur im Quelltext und in Zwischendateien zur fertigen Exe (Debug-Builds zähle ich mal nicht als fertige Exe).

MadMan2k
2006-09-20, 12:39:30
thx, eigentlich alles ganz einfach. bin nur durcheinander gekommen, weil ich dachte der prozessor müsste zwischen pointern und normalen daten unterscheiden - aber das due ich ja durch die derefenzierung beim programmeiren schon.

noch ne kleinigkeit:
geh ich recht von der annahme aus, dass pointer unter 32bit systemen auch 32bit lang sind während sie auf 64bit system 64bit lang sind? (um die größere mögliche speichergröße zu erfassen)

Gast_
2006-09-20, 13:07:46
geh ich recht von der annahme aus, dass pointer unter 32bit systemen auch 32bit lang sind während sie auf 64bit system 64bit lang sind? (um die größere mögliche speichergröße zu erfassen)

Ja natürlich. Allerdings ist unsigned int unter 64-Bit-Systemen nicht immer 64-Bit breit, also must aufpassen wenn du Pointer->Ganzzahl casten willst.

Gast
2006-09-20, 16:11:04
Üblicherweise werden Variablennamen schon beim Compilieren entsorgt und nurnoch mit Adressen gearbeitet.
[...] Beim Kompilieren werden Speicheradressen daraus.[...]Nein, das wird erst beim Linken gemacht.

Würde das beim Kompilieren geschehen, könntest du z.B. nicht auf Variablen zugreifen, die in anderen source-Dateien definiert sind, weil jede Datei für sich kompiliert wird. Welche Addresse sollte denn der Kompiler einer "extern int schiessMichTod;" - Variablen zuweisen?!

Gast
2006-09-27, 11:30:24
Ja natürlich. Allerdings ist unsigned int unter 64-Bit-Systemen nicht immer 64-Bit breit, also must aufpassen wenn du Pointer->Ganzzahl casten willst.

Wer castet schon einen 4Btye großen Pointer auf einen 8Byte (z. B.) Datentyp? LOL

Gast
2006-09-27, 12:19:34
Wie jetzt? Der Pointer ist 8 Bytes groß und der int nicht. Das machen Programme die ursprünglich für 32-Bit-Systeme geschrieben würden durchaus manchmal wodurch es zu Problemen kommt wenn man die Programme als 64-Bit-Binary kompilieren will.