Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!


Referenz - Pointer

Referenz-Navigation

 

Ein Pointer ist eine Zahl. Diese Zahl gibt eine Adresse (Nummer des Bytes) im Speicher an. Auf die Speicherstelle, auf die der Pointer zeigt, kann über besondere Syntax-Regeln zugegriffen werden. Mit Hilfe von Pointern kann direkt auf den Speicher zugegriffen werden. Dies ermöglicht eine einfachere, flexiblere Verwaltung des Speichers als mit BefehlsreferenzeintragPEEK und BefehlsreferenzeintragPOKE.

Im Zusammenhang mit Pointern treten folgende Sprachkonstrukte auf:

PTR
Wird im Zusammenhang mit DIM und FUNCTION verwendet. Gibt an, dass eine Variable ein Pointer ist.

DIM a AS BYTE PTR

Im Programm kann auf die als Pointer deklarierte Variable ganz normal zugegriffen werden; sie verhält sich immer wie eine Variable des Typs BefehlsreferenzeintragUINTEGER.

DIM a AS BYTE PTR
DIM z AS BYTE
z = 120
a = VARPTR(z)
PRINT z, a
' Ausgabe: 120     4210692
' Also ist a mindestens 32bit

a = -1
PRINT a
' Ausgabe: 4294967295
' Also ist jeder Pointer ein UInteger-Typ. Ist auch logisch,
' negative Adressen gibt es nicht.

SLEEP

Wertezuweisungen (myPointer = 5), Operationen (myValue = (myPointer * 5) AND 3) und alle sonstigen Befehle werden genauso ausgeführt, wie an jeder skalaren, ('normalen') Variable auch. Es existieren allerdings auch einige Pointeroperatoren, die nur mit Pointern funktionieren. Diese sind hier unten aufgeführt:

@Variable
Gibt die Adresse einer Variablen zurück, also einen Pointer, der auf die Variable zeigt. Es ist eine Kurzform für BefehlsreferenzeintragVARPTR. Dies kann auch an nicht-Pointer-Variablen angewandt werden; zurückgegeben wird dann einfach die Adresse als INTEGER-Wert.
Beispiel:

DIM myValue AS INTEGER
DIM myPointer AS INTEGER PTR

myPointer = @myValue

PRINT myPointer, @myPointer

(Gibt die Adresse von myValue und die Adresse des Pointers selbst aus.)

*(Pointer)
Gibt den Wert zurück, der an der Speicherstelle steht, auf die der Pointer zeigt (Dereferenzierung). Auch komplexe Pointerausdrücke können dereferenziert werden, d.h. in der Klammer kann ein ganzer Ausdruck stehen, der dann als Pointer behandelt wird. Vorsicht: Wenn Sie auf Speicherstellen zugreifen, die nicht von Variablen Ihres Programms verwendet werden, riskieren Sie einen Absturz Ihres Programmes oder sogar des Betriebssystems!
Beispiel:

DIM myValue
DIM myPointer AS INTEGER PTR

myValue = 5
myPointer = @myValue

PRINT *myPointer
 ' Gibt den Wert von myValue aus, da myPointer
' auf die Adresse von myValue zeigt.

PRINT *(myPointer + 1)
 ' Gibt einen anderen Wert aus, der i.d.R. nicht
 ' genau bestimmt werden kann, da auf der
 ' Speicherstelle, die ein Byte hinter myValue liegt,
 ' bereits ein anderer Wert gespeichert ist.

Pointer[index]
Zählt zum Pointer index hinzu, bevor weitere Operationen mit ihm durchgeführt werden. Der Pointer wird also dereferenziert.

Pointer[index]

hat die selbe Funktion wie

*(Pointer + index)

Diese Art der Dereferenzierung wird oft mit BefehlsreferenzeintragALLOCATE verwendet.

Beispiel:

DIM a AS BYTE PTR
a = ALLOCATE(10)
a[3] = 20
PRINT a[3]
PRINT a[4]
PRINT a

(Wenn a[4] ungleich 0 ist, liegt das daran, dass sich vor der Reservierung des Speicherbereichs noch Daten auf dieser Stelle befanden, die jetzt nicht mehr gebraucht werden; eine Initialisierung mit BefehlsreferenzeintragCALLOCATE sollte zehn leere Speicherstellen erzeugen.

->
Dereferenziert einen Pointer, der auf einen UDT (user defined Type; siehe BefehlsreferenzeintragTYPE) zeigt, sodass er auf den entsprechenden Record verweist.
Beispiel:

TYPE myType
   a AS INTEGER
   b AS SHORT
   c AS INTEGER PTR
END TYPE

DIM d AS myType PTR

PRINT d->b


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 02.08.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 12.12.2011 von RedakteurJojo gespeichert.
  Versionen Versionen