Differenze tra le versioni di "Dereferenziare un Puntatore di Puntatore con le funzioni specifiche di dereferenziazione e con i Memory Stream"

Da Gambas-it.org - Wikipedia.
Riga 8: Riga 8:
  
 
Le funzioni direferenziazione sono quelle che derefenziano il ''Puntatore'' nel relativo tipo di dato, al quale ese si riferiscono.
 
Le funzioni direferenziazione sono quelle che derefenziano il ''Puntatore'' nel relativo tipo di dato, al quale ese si riferiscono.
<BR>Esse sono: ''Byt@( )'', ''Bool@( )'', ''Short@( )'', ''Single@( )'', ''String@( )'', ''Int@( )'', ''Long@( )'', ''Float@( )'', ''Pointer@( )''.
+
<BR>Esse sono: [[Byte@|Byte@()]]", "[[Boolean@|Bool@()]]", [[Short@|Short@()]]", "[[Single@|Single@()]]", "[[Int@|Int@()"]], "[[Long@|Long@()]]", "[[Float@|Float@()]]", "[[String@|String@()]]", "[[Pointr@|Pointer@()]]".
  
  
Riga 20: Riga 20:
 
   Dim st, st2 As Stream
 
   Dim st, st2 As Stream
 
   
 
   
 
 
 
  <FONT Color=gray>' ''Valore iniziale, che alla fine della dereferenziazione si dovrà riottenere:''</font>
 
  <FONT Color=gray>' ''Valore iniziale, che alla fine della dereferenziazione si dovrà riottenere:''</font>
 
   b = 44
 
   b = 44
Riga 30: Riga 29:
 
   p2 = VarPtr(p)
 
   p2 = VarPtr(p)
 
      
 
      
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
 
   
 
   
 
  <FONT Color=gray>' ''Ora, dereferenziamo il "Puntatore" di "Puntatore" con le apposite funzioni di dereferenziazione:''</font>
 
  <FONT Color=gray>' ''Ora, dereferenziamo il "Puntatore" di "Puntatore" con le apposite funzioni di dereferenziazione:''</font>
Riga 38: Riga 36:
 
   
 
   
 
   
 
   
Print "-----------------------"
 
 
  <FONT Color=gray>' ''Ora, dereferenziamo il "Puntatore" di "Puntatore" con i "[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]":''</font>
 
  <FONT Color=gray>' ''Ora, dereferenziamo il "Puntatore" di "Puntatore" con i "[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]":''</font>
 
    
 
    

Versione delle 20:07, 20 ago 2022

Un Puntatore di Puntatore è una variabile di tipo Puntatore che punta ad un'altra variabile di tipo Puntatore. E' pertanto una variabile che contiene l'indirizzo di memoria di una variabile che a sua volta contiene l'indirizzo di memoria di una variabile contenente un valore, un dato, oppure di un'area riservata di memoria.


Per "dereferenziare" [Nota 1] un Puntatore di Puntatore, esistono almeno due modalità:

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


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


Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione VarPtr() un Puntatore di Puntatore, e poi si percorrerà il cammino all'indietro riottenendo il valore puntato da un Puntatore puntato a sua volta da un Puntataore, così come lo abbiamo realizzato, attraverso nella prima modalità con una delle suddette funzioni di dereferenziazione, nella seconda modalità con i Memory Stream. Ad ogni modo, in entrambe le modalità di dereferenziazione il processo avviene con due fasi:

  • dereferenziazione del "Puntatore" di "Puntatore", ottenendo il primo "Puntatore" (ossia l'indirizzo di memoria della variabile contnente il dato iniziale);
  • dereferenziazione del "Puntatore", ottenendo il valore contenuto dalla variabile contenente il dato di partenza.
Public Sub Main()

 Dim b, n As Byte
 Dim p, p2, ritP, sP As Pointer
 Dim st, st2 As Stream

' Valore iniziale, che alla fine della dereferenziazione si dovrà riottenere:
  b = 44
  
' Creiamo il primo "Puntatore", che punta all'indirizzo di memoria della varianbile "b":
  p = VarPtr(b)
   
' Creiamo il secondo "Puntatore", che punta all'indirizzo di memoria della varianbile "p":
  p2 = VarPtr(p)
   

' Ora, dereferenziamo il "Puntatore" di "Puntatore" con le apposite funzioni di dereferenziazione:
  ritP = Pointer@(p2)
   
  Print Byte@(ritP)


' Ora, dereferenziamo il "Puntatore" di "Puntatore" con i "Memory Stream":
 
  st2 = Memory p2 For Read
    Read #st2, sP
    st = Memory sP For Read
      Read #st, b
      Print b
       
    st.Close
  st2.Close

End



Note

[1] Ricordiamo che "Dereferenziare" significa accedere al valore della variabile puntata dal Puntatore.