Pointer dereferenzieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Pointer dereferenzieren

Beitrag von NicTheQuick »

Du willst einfach komplette Strukturen kopieren?

Code: Alles auswählen

 Structure Person
   Name.s
   Age.i
EndStructure

Define.Person Fred, *any, Copy

Fred\Name = "Fred"
Fred\Age = 25

*any = @Fred
Debug *any\Name
Debug *any\Age 

CopyStructure(*any, Copy, Person)
Debug Copy\Name
Debug Copy\Age
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Pointer dereferenzieren

Beitrag von NicTheQuick »

Mal allgemein was bezüglich "Dereferenzieren":
In Purebasic gibt zwei Arten zu dereferenzieren, mit angehängter Struktur und ohne. In C kann man jeden Datentyp zu einem Pointer machen, auch Pointer selbst. Das geht in einer Zeile zum Beispiel so:

Code: Alles auswählen

int* p = 0; //Pointer auf einen Integer
Hat man jetzt einen Integer und will den Zeiger 'p' darauf zeigen lassen, macht man das so:

Code: Alles auswählen

int a = 123;
p = &a;
Auf den Zeiger zugreifen, kann man lesend und schreibend über 'p'. Damit kann man die Zeigeradresse auslesen und ändern.
Möchte man den Zeiger dereferenzieren, nutzt man den Dereferenzierungsoperator *, d.h mit "*p" kann man auf den Wert an der Stelle, auf die der Zeiger zeigt, lesend und schreibend zugreifen. In diesem Fall wäre das 123. Ändert man in diesem Beispiel 'p' nicht, kann man durch Änderung von '*p' auch gleichzeitig den Wert von 'a' ändern.

In Purebasic sieht das ganze so aus:

Code: Alles auswählen

Define *p.Long = 0 ;Pointer auf eine Long-Struktur (äquivalent zu int in C)
Um das selbe wie in C zu erreichen, nutzt man hier eine Struktur anstatt des nativen Datentyps '.i'. Sonst könnte Purebasic später nicht unterscheiden, ob man den Pointer selbst oder den dereferenzierten Wert lesen bzw. schreiben möchte.

Code: Alles auswählen

Define a.l = 123
*p = @a
Möchte man hier den Zeiger nun dereferenzieren, muss man die angehängte Struktur 'Long' verwenden, d.h. mit '*p\l' kann man lesend und schreibend auf den dereferenzierten Wert zugreifen, Möchte man nur den Zeiger selbst lesen oder schreiben, nutzt man '*p'. Die Variable 'p' hingegen ist wieder eine neue Variable und hat nichts mit '*p' zu tun.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Pointer dereferenzieren

Beitrag von es_91 »

Deine Worte, NicTheQuick, wie immer klar und deutlich. Obwohl ich mich an einen thread hier im Forum erinnern kann, bei dem ich schonmal auf CopyStructure hingewiesen wurde (mit anderer Fragstellung) erscheint mir das neu. Denn dass das den Zweck des Dereferenzierens ersetzt habe ich damals nicht verstanden. Funktioniert super !
Antworten