Dereferenziare un Puntatore con le funzioni specifiche di dereferenziazione e con i Memory Stream

Da Gambas-it.org - Wikipedia.

Come sappiamo, un Puntatore è una variabile che non contiene il valore scritto in memoria, bensì l'indirizzo numerico di memoria della prima cella ove il valore è memorizzato. Pertanto, si dice che il Puntatore punta a tale indirizzo di memoria e che punta a una variabile.

Quindi, andando a leggere il valore contenuto da una variabile di tipo Puntatore, si otterrà semplicemente l'indirizzo di memoria al quale il Puntatore punta.

Dal Puntatore è possibile accedere all'indirizzo di memoria della unica cella (se il valore può essere rappresentato da un solo byte-dato), ove il valore è memorizzato, oppure alla prima del gruppo di celle di memoria, ove il valore è memorizzato (se il valore deve essere rappresentato da più byte di dati).

Tale operazione di lettura dell'area di memoria dal Puntatore è chiamata: dereferenziazione del Puntatore.

Per "dereferenziare " un Puntatore, esistono almeno due modalità:

  • mediante le apposite funzioni di dereferenziazione posseduta dai tipi nativi di dati;
  • mediante la risorsa Memory Stream.


Derefereziazione del Puntatore mediante le apposite funzioni

Le funzioni di dereferenziazione sono quelle che derefenziano il Puntatore nel relativo tipo di dato, al quale esse si riferiscono.
Esse sono: Byte@()", "Bool@()", Short@()", "Single@()", "Int@()", "Long@()", "Float@()", "String@()", "Pointer@()".

Mostriamo di seguito un semplice esempio esplicativo, nel quale si genererà mediante la funzione "VarPtr()" una variabile di tipo Puntatore che punta a una variabile di tipo "Intero". Tale Puntatore sarà dereferenziato mediante la funzione "Int@()".

Public Sub Main()

 Dim i As Integer
 Dim p As Pointer

 i = 1000

 p = VarPtr(i)

' Si dereferenzia il "Puntatore" per leggere nell'area di memoria alla quale esso punta:
 Print Int@(p)

End


Derefereziazione del Puntatore mediante la risorsa Memory Stream

La dereferenziazione può avvenire anche con la risorsa "Memory Stream".
La risorsa "Memory Stream" crea una variabile di tipo "Stream" che rappresenta il flusso dei dati dell'area di memoria allocata e puntata dal Puntatore.
Pertanto con la risorsa "Memory Stream" si potranno leggere (ma anche scrivere) i dati-byte, contenuti nell'area di memoria, attraverso detta variabile di tipo "Stream".

Esempio:

Public Sub Main()

 Dim i, n As Integer
 Dim p As Pointer
 Dim st As Stream

 i = 1000
 p = VarPtr(i)

' Genera la variabile di tipo "Stream" dal "Puntatore":
 st = Memory p for Read

' Legge nel flusso di dati generato, appartenenti all'area di memoria puntata dal "Puntatore":
 read #st, n

 st.Close

 Print n

End