Variabili di tipo Puntatore e loro dereferenziazione

Da Gambas-it.org - Wikipedia.

Per porre l'indirizzo di memoria di una variabile qualsiasi in una variabile di tipo Puntatore (As Pointer), si utilizza la funzione VarPtr. |1|

variabile_puntatore = VarPtr(variabile_da_puntare)

Successivamente, per dereferenziare |2| il pointer, ossia per estrarre il valore contenuto nella variabile puntata dal puntatore, è possibile usare:

  • i Memory-Stream in lettura (soprattutto se è stata utilizzata una zona riservata di memoria con la funzione Alloc, e l'indirizzo è stato passato alla variabile pointer da una funzione esterna richiamata con Extern);
  • più brevemente una specifica funzione che restituisca il valore memorizzato all'indirizzo specificato dal Puntatore: Int@, Byte@, Float@, etc, a seconda del tipo.


Esempio:

Public Sub Button1_Click()

 Dim datoInt, intDef As Integer
 Dim byDef As Byte
 Dim datoPtr As Pointer
 Dim byPtr As Pointer
 Dim byStrm As Stream

  datoInt = 2

' Poniamo nel pointer "dato1Ptr" l'indirizzo che punta alla variabile Integer "datoInt":
   datoPtr = VarPtr(datoInt)

' Allochiamo memoria sufficiente:
  byPtr = Alloc(2)

' Supponiamo che venga usata una funzione esterna (ovviamente dichiarata con Extern, che qui si omette)
 ' la quale passi un dato byte alla variabile "byPtr", e che quindi possiamo raccogliere:
  funzione_esterna(param1, byPtr)


' Andiamo ora a "dereferenziare" i pointer, ossia ad estrarre i valori contenuti nelle variabili,
 ' i cui indirizzi di memoria sono puntati dai precedenti puntatori.
  
' Dereferenziamo il pointer "datoPtr" con la funzione specifica "Int@":
  intDef = Int@(datoPtr)

' Dereferenziamo ora il pointer "byPtr" con i "Memory-Stream":
  byStrm = Memory byPtr For Read
' Leggiamo quindi la variabile di tipo "stream", e poniamo il valore nella variabile di tipo byte:
  Read #byStrm, byDef


' Andiamo quindi a mostrare i relativi dati:
  Print intDef
  Print byDef

' De-allochiamo la memoria precedentemente riservata e chiudiamo il flusso:
  free(byPtr)
  byStrm.Close
 
End


In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte:

Public Sub Button1_Click()

 Dim a As Byte
 Dim aPtr As Pointer
 Dim aSt As Stream
 Dim a1Post, a2Post As Byte
 
   a = 2
 
' Poniamo nella variabile pointer l'indirizzo della variabile byte "a":
    aPtr = VarPtr(a)
   
   
' Dereferenziamo il Pointer:

' con la funzione specifica "Byte@":
    a1Post = Byte@(aPtr)
     
' e con i Memory-Stream:
    aSt = Memory aPtr For Read
    Read #aSt, a2Post
    aSt.Close
     
     
' Quindi leggiamo i due valori restituiti:
    Print "a1Post = "; a1Post
    Print "a2Post = "; a2Post

End

In console avremo coerentemente:
a1Post = 2
a2Post = 2


Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna

Per quest'argomento rimandiamo alla specifica pagina presente nella WIKI:
Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna.


Note

[1] Se la variabile di tipo Puntatore deve puntare ad una variabile (o meglio: contenere l'indirizzo di memoria di una variabile) già presente e già valorizzata, allora si userà la funzione VarPtr.
Se la variabile di tipo Puntatore deve essere utilizzata per creare un variabile di tipo Stream, nel quale successivamente scrivere dati, allora si allocherà una parte di memoria mediante la funzione Alloc( ).

[2] Dereferenziare un Pointer: accedere al valore della variabile puntata dal puntatore.