Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

indeed

Frischling

  • »indeed« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Dortmund

  • Private Nachricht senden

1

13.10.2007, 18:17

funktionsweise von Zeigern richtig verstanden?

Ich habe mir gerade den Anfang von Kapitel 6 durchgelesen und mir die Frage gestellt, ob dich das so alles richtig verstanden habe. Am besten ich schreibe einfach mal, wie ich die Funktionsweise von Zeigern verstehe.

Wenn ich eine Variable, Instanz einer Struktur oder was weiss ich in main() erzeuge und an eine Funktion als Parameter übergebe, kommt diese auf den Stack, wo ihr Inhalt zwischengespeichert wird. Die Funktion erzeugt dann eine Kopie der Variable, mir der dann gearbeitet werden kann. Wenn die Variable dann per return zurückgegeben wird, kommt ihr Wert wieder auf den Stack, von wo der Wert dann von der main() Funktion wieder abgeholt wird.
Also geht durch das ganze Zwischenspeichern und kopieren Zeit verloren.

Jetzt kann ich Variablen etc. aber auch im Heap erzeugen. Diese bekommt dort eine Adresse zugeteilt, mit der ich von überall auf diese Variable zugreifen kann. Dh. der Unterschied zu einer globalen Variable ist nur der, dass ich die Adresse brauche, um auf die Variable zuzugreifen. Der Heap ist also auch global.
Nun kann ich eine Variable aber auch lokal in einer Funktion erzeugen und mir - wie auch immer - die Adresse ausgeben lassen. Somit kann ich durch Angabe dieser Adresse direkt auf die Variable zugreifen, ohne dass sie dazu im Gültigkeitsbereich liegen muss, da ich ja direkt auf die Speicherstelle zugreife.

Heisst das, das einzige was eine globale von einer im Heap erzeugten Variable unterscheidet ist, dass man bei einer Variable im Heap die Adresse der Speicherstelle angeben muss und somit direkt auf die Speicherstelle im virt. Speicher zugreift, die Variable an sich aber nicht existiert, und somit nicht die Gefahr besteht, dass man sie unabsichtlich verändert?

Mit Zeigern verändere ich also immer direkt den Wert im Speicher, auch wenn der Name, der diesem Speicherbereich zugeordnet ist nicht mehr bekannt ist?

SirForce

Alter Hase

Beiträge: 802

Wohnort: Süddeutschland

  • Private Nachricht senden

2

13.10.2007, 18:46

Sie existiert schon, es ist halt nur eine art Kopie^^!
Nichts behindert so sehr die Entwicklung der Intelligenz wie ihre vollständige Abwesenheit.

Michail Genin

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

13.10.2007, 20:21

Der 'Name' ist im ausführbaren Programm ohne Debuginfos sowieso nicht mehr vorhanden ;)
Du hast anscheinend noch einiges nicht vollständig oder sogar falsch verstanden.

- Variablen landen letztendlich alle im Arbeitsspeicher und jeder Bereich im Arbeitsspeicher ist adressierbar.
Wenn du eine Variable lokal in einer Funktion erzeugst dann hat sie trotzdem eine Position im Arbeitsspeicher und damit auch eine eigene Adresse. Eine per new auf dem Heap erzeugte Variable bekommt ebenfalls einen Speicherort auf dem Arbeitsspeicher und der Rückgabewert von new ist genau diese Adresse.

Wenn eine Funktion jetzt einen Pointer als Parameter übergeben bekommt dann ist es relativ egal, ob der Pointer auf den Heap oder eine lokale Variable der aufrufenden Funktion zeigt - es sind alles Adressen im Speicher und es gibt keinen Unterschied in der Handhabung.
Wenn man das ein bisschen weiter denkt ist auch klar, dass du einen kleinen Denkfehler im Bezug auf den Unterschied zwischen Heap und globalen Variablen hast. Jeder Pointer kann auf beide Typen von Variablen zeigen und somit bleibt es Aufgabe des Programmierers dafür zu sorgen, dass Pointer nur dahin zeigen wo sie hinzeigen sollen.
Nur wenn man (ausversehen) den Adressbereich verlässt, den Windows dem eigenen Programm zugeteilt hat wird ein Zugriff auf den Speicher evtl. verhindert, solange man im eigenen Programm bleibt kann man nahezu ungehindert den ganzen Speicher zermurksen indem man einen Pointer irgendwo hinzeigen lässt und dann damit arbeitet ;)

indeed

Frischling

  • »indeed« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Dortmund

  • Private Nachricht senden

4

14.10.2007, 01:45

Mit Name meinte ich nur einfach Bezeichnung der Variable. Wollte sagen, normalerweise greift man ja mit der Variable auf die Speicherstelle zu. Wenn die Variable jetzt aber zB in der main Funktion initialisiert wurde, kann ich in einer anderen Funktion über diese Variable nicht mehr auf den Speicher der für diese Variable reserviert ist zugreifen, weil die Variable nicht mehr im Gültigkeitsbereich liegt.
Mit nem Pointer kann ich nun aber gezielt diese Speicherstelle ansprechen und den Wert verändern, weil die Adresse im Speicher, sowie der Datentyp, also die Größe des reservierten Speichers, bekannt ist.

Oder wolltest du mir damit was anderes sagen und ich habs nur nicht verstanden? :roll:

SirForce

Alter Hase

Beiträge: 802

Wohnort: Süddeutschland

  • Private Nachricht senden

5

14.10.2007, 11:42

So ungefähr stimmt das schon, du solltest dir aber gerade bei dem Thema Zeit lassen, bis du es richtig verstanden hast. Denn wie du ja schon richtig erkannt hast, sind Zeiger (und Referenzen) ziemlich nützlich und sollten dementsprechend auch beherrscht werden!
Nichts behindert so sehr die Entwicklung der Intelligenz wie ihre vollständige Abwesenheit.

Michail Genin

Werbeanzeige