Differenze tra le versioni di "Conoscere con i Puntatori i valori contenuti in un vettore"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
Un vettore è sostanzialmente un Oggetto, nella cui area di memoria sono contenuti dati del medesimo tipo, ossia che occupano la medesima quantità di memoria (tutti ''Byte'', o tutti ''Short'', o tutti ''Integer'', oppure tutti appartenenti ad un medesimo tipo di Oggetti e così via).
 
Un vettore è sostanzialmente un Oggetto, nella cui area di memoria sono contenuti dati del medesimo tipo, ossia che occupano la medesima quantità di memoria (tutti ''Byte'', o tutti ''Short'', o tutti ''Integer'', oppure tutti appartenenti ad un medesimo tipo di Oggetti e così via).
  
I vettori mettono a disposizione, fra l'altro, la proprietà ''.Data'', che restituisce un ''Puntatore'' (ossia l'indirizzo di memoria) ai dati contenuti dal vettore medesimo.
+
I vettori mettono a disposizione, fra l'altro, la Proprietà ".Data", che restituisce un ''Puntatore'' (ossia l'indirizzo di memoria) ai dati contenuti dal vettore medesimo.
 
 
E' possibile spostandoci lungo l'area di memoria puntata da tale ''Puntatore'' secondo la quantità di memeoria occupata dal tipo di vettore (''Byte[]'', ''Short[]'', etc), leggere i valori contenuti dalla variabile vettoriale.
 
  
 +
E' possibile spostandoci lungo l'area di memoria puntata da tale ''Puntatore'' secondo la quantità di memeoria occupata dal tipo di vettore ("Byte[]", "Short[]", etc), leggere i valori contenuti dalla variabile vettoriale.
  
 
==Conoscere con il ''Puntatore'' i valori di un vettore del tipo numerico==
 
==Conoscere con il ''Puntatore'' i valori di un vettore del tipo numerico==
Riga 13: Riga 12:
 
    
 
    
 
   Dim ii As Integer[] = [2, 22, 222, 2222, 22222, 222222, 2222222]
 
   Dim ii As Integer[] = [2, 22, 222, 2222, 22222, 222222, 2222222]
   Dim p As Pointer
+
   Dim i As Integer
   Dim b As Byte
+
   
+
   For i = 0 To ii.Max
  p = ii.Data
+
  <FONT Color=gray>' ''Dereferenziamo il puntatore per ottenere il valore contenuto dalla locazione di memoria puntata.''
   
+
  ' ''Trattandosi in questo esempio di un vettore di tipo "Intero", spostiamo il puntatore interno all'area di memoria pari al numero di byte di memoria occupata dal tipo "Intero".''</font>
  For b = 0 To ii.Max
+
     Print i, Int@(ii.Data + (SizeOf(gb.Integer) * i))
  <FONT Color=gray>' ''Dereferenziamo il puntatore per ottenere il valore contenuto dalla locazione di memoria puntata:''</font>
+
  Next
    Print b;; Int@(p)
+
  <FONT Color=gray>' ''Trattandosi di un vettore di tipo "Intero", spostiamo il puntatore interno all'area di memoria
 
' ''pari al numero di byte di memoria occupata dal tipo "Intero":''</font>
 
     p = p + SizeOf(gb.Integer)
 
  Next
 
   
 
 
  '''End'''
 
  '''End'''
 
  
  
 
==Conoscere con il ''Puntatore'' i valori di un vettore del tipo di un Oggetto==
 
==Conoscere con il ''Puntatore'' i valori di un vettore del tipo di un Oggetto==
Dereferenziando il ''Puntatore'' ai dati di un vettore di Oggetti attraverso la sua proprietà ''.Data'', vedremo che ogni 8 byte (a partire ovviamente da quello di indice 0, ossia il primo byte) sono conservati gli indirizzi di memoria ove sono contenuti gli Oggetti in ciascun elemento del vettore predetto. Un elemento di un vettore di Oggetti è sostanzialmente un ''Puntatore'' ad un indirizzo di memoria dell'Oggetto contenuto dal vettore.
+
Dereferenziando il ''Puntatore'' ai dati di un vettore di Oggetti attraverso la sua Proprietà ".Data", vedremo che ogni 8 byte (a partire ovviamente da quello di indice 0, ossia il primo byte) sono conservati gli indirizzi di memoria ove sono contenuti gli Oggetti in ciascun elemento del vettore predetto. Un elemento di un vettore di Oggetti è sostanzialmente un ''Puntatore'' ad un indirizzo di memoria dell'Oggetto contenuto dal vettore.
  
 
Sarà dunque necessario dereferenziare ognuno di quegli indirizzi di memoria per ottenere i valori contenuti dagli Oggetti. Tali valori sono individuabili a cominciare dal 25° byte (indice 24).
 
Sarà dunque necessario dereferenziare ognuno di quegli indirizzi di memoria per ottenere i valori contenuti dagli Oggetti. Tali valori sono individuabili a cominciare dal 25° byte (indice 24).
  
 
+
Mostriamo un esempio con un vettore di tipo "Struttura[]":
Mostriamo un esempio con un vettore di tipo ''Struttura[ ]'':
 
 
  Public Struct STRUTTURA
 
  Public Struct STRUTTURA
 
   b As Byte
 
   b As Byte
Riga 52: Riga 44:
 
   Dim st As Stream
 
   Dim st As Stream
 
   Dim j, b As Byte
 
   Dim j, b As Byte
 
 
  With sr = New STRUTTURA
 
    .b = 1
 
    .sh = 11
 
    .i = 111
 
    .s = "sr num.1"
 
  End With
 
 
 
  sstt.Push(sr)
 
 
 
  With sr = New STRUTTURA
 
    .b = 2
 
    .sh = 22
 
    .i = 222
 
    .s = "sr num.2"
 
  End With
 
 
 
  sstt.Push(sr)
 
 
   
 
   
  With sr = New STRUTTURA
+
  With sr = New STRUTTURA
    .b = 3
+
    .b = 1
    .sh = 33
+
    .sh = 11
    .i = 333
+
    .i = 111
    .s = "sr num.3"
+
    .s = "sr num.1"
  End With
+
  End With
 
+
  sstt.Push(sr)
  sstt.Push(sr)
+
 +
  With sr = New STRUTTURA
 +
    .b = 2
 +
    .sh = 22
 +
    .i = 222
 +
    .s = "sr num.2"
 +
  End With
 +
  sstt.Push(sr)
 +
 +
  With sr = New STRUTTURA
 +
    .b = 3
 +
    .sh = 33
 +
    .i = 333
 +
    .s = "sr num.3"
 +
  End With  
 +
  sstt.Push(sr)
 +
 +
  p = sstt.data
 
   
 
   
  p = sstt.data
 
 
 
 
  <FONT Color=gray>' ''Dereferenziamo il puntatore al vettore di tipo STRUTTURA[]:''</font>
 
  <FONT Color=gray>' ''Dereferenziamo il puntatore al vettore di tipo STRUTTURA[]:''</font>
  st = Memory p For Read
+
  st = Memory p For Read
  <FONT Color=gray>' ''Andiamo a leggerne i dati byte per byte. Noteremo che ci sono tre valori che si riferiscono''
+
  <FONT Color=gray>' ''Andiamo a leggerne i dati byte per byte. Noteremo che ci sono tre valori - che cominciano rispettivamente all'indice 0, 8 e 16 - i quali si riferiscono agli indirizzi di memoria delle tre variabili di tipo "STRUTTURA" contenuti dal vettore di tipo "STRUTTURA[]".''
' ''agli indirizzi di memoria delle tre variabili di tipo "STRUTTURA" contenuti dal vettore di tipo "STRUTTURA[]".''
 
 
  ' ''Essendo tre puntatori, leggeremo In totale 3 * 8 byte: ossia 3 variabili per la quantità di byte di memoria occupata da un "Puntatore":''</font>
 
  ' ''Essendo tre puntatori, leggeremo In totale 3 * 8 byte: ossia 3 variabili per la quantità di byte di memoria occupata da un "Puntatore":''</font>
  For j = 0 To (sstt.Count * SizeOf(gb.Pointer)) - 1
+
  For j = 0 To (sstt.Count * SizeOf(gb.Pointer)) - 1
    Read #st, b
+
    Read #st, b
    Print j;; Hex(b, 2)
+
    Print j;; Hex(b, 2)
  Next
+
  Next
  st.Close
+
  st.Close
  Print "============="
+
  Print "============="
 
+
   
 
+
  <FONT Color=gray>' ''Per poter ricavare i valori contenuti nella prima varibile di tipo "STRUTTURA", bisognerà ottenere il primo indirizzo di memoria, che è posto al primo byte (indice 0) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]".''
  <FONT Color=gray>' ''Per poter ricavare i valori contenuti nella prima varibile di tipo "STRUTTURA", bisognerà ottenere il primo indirizzo di memoria,''
+
  ' ''Utilizziamo la funzione di dereferenziazione di un "Puntatore di Puntatore".''</font>
' ''che è posto al primo byte (indice 0) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]":
+
  p1 = Pointer@(p)
  ' ''Utilizziamo la funzione di dereferenziazione di un "Puntatore di Puntatore":''</font>
+
  Print p1
  p1 = Pointer@(p)
+
 
  Print p1
+
  <FONT Color=gray>' ''Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore a tale prima variabile spostandoci al 25° byte (indice 24) nell'area di memoria del "Puntatore":''</font>
 
+
  Print Byte@(p1 + '''24''')
  <FONT Color=gray>' ''Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore"''
+
  <FONT Color=gray>' ''Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA", ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):''</font>
' ''a tale prima variabile spostandoci al 25° byte nell'area di memoria del "Puntatore":''</font>
+
  Print Short@(p1 + '''26''')
  p1 = p1 + 24
 
  Print Byte@(p1)
 
  <FONT Color=gray>' ''Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA",''
 
' ''ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):''</font>
 
  p1 = p1 + 2
 
  Print Short@(p1)
 
 
  <FONT Color=gray>' ''Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:''</font>
 
  <FONT Color=gray>' ''Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:''</font>
  p1 = p1 + 2
+
  Print Int@(p1 + '''28''')
  Print Int@(p1)
 
 
  <FONT Color=gray>' ''Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".''
 
  <FONT Color=gray>' ''Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".''
  ' ''Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore''
+
  ' ''Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore della Stringa, e successivamente il Puntatore alla Stringa:''</font>
' ''della Stringa, e successivamente il Puntatore alla Stringa:''</font>
+
  ps = Pointer@(p1 + '''32''')
  p1 = p1 + 4
+
  Print String@(ps)
  ps = Pointer@(p1)
 
  Print String@(ps)
 
 
  <FONT Color=gray>' ''oppure più brevemente:''</font>
 
  <FONT Color=gray>' ''oppure più brevemente:''</font>
  Print String@(Pointer@(p1))
+
  Print String@(Pointer@(p1 + 32))
  Print "======================="
+
  Print "======================="
   
+
   
+
  <FONT Color=gray>' ''Per poter ricavare i valori contenuti nella seconda varibile di tipo "STRUTTURA", bisognerà ottenere il secondo indirizzo di memoria,
+
  <FONT Color=gray>' ''Per poter ricavare i valori contenuti nella seconda varibile di tipo "STRUTTURA", bisognerà ottenere il secondo indirizzo di memoria, che è posto al 9° byte (indice 8) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]". Infatti un "Puntatore" occupa 8 byte di memoria.''</font>
' ''che è posto al 9° byte (indice 8) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]". Infatti un "Puntatore" occupa 8 byte di memoria.''</font>
+
  p = p + 8
  p = p + 8
+
  p2 = Pointer@(p)
  p2 = Pointer@(p)
+
  Print p2   
  Print p2   
+
  <FONT Color=gray>' ''Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore" a tale prima variabile spostandoci al 25° byte (indice 24) nell'area di memoria del "Puntatore":''</font>
  <FONT Color=gray>' ''Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore"''
+
  Print Byte@(p2 + '''24''')
' ''a tale prima variabile spostandoci al 25° byte nell'area di memoria del "Puntatore":''</font>
+
  <FONT Color=gray>' ''Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA", ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):''</font>
  p2 = p2 + 24
+
  Print Short@(p2 + '''26''')
  Print Byte@(p2)
 
  <FONT Color=gray>' ''Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA",
 
' ''ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):''</font>
 
  p2 = p2 + 2
 
  Print Short@(p2)
 
 
  <FONT Color=gray>' ''Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:''</font>
 
  <FONT Color=gray>' ''Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:''</font>
  p2 = p2 + 2
+
  Print Int@(p2 + '''28''')
  Print Int@(p2)
 
 
  <FONT Color=gray>' ''Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".''
 
  <FONT Color=gray>' ''Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".''
  ' ''Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore''
+
  ' ''Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore della Stringa, e successivamente il Puntatore alla Stringa.''</font>
' ''della Stringa, e successivamente il Puntatore alla Stringa:''</font>
+
  ps = Pointer@(p2 + '''32''')
  p2 = p2 + 4
+
  Print String@(ps)
  ps = Pointer@(p2)
 
  Print String@(ps)
 
 
  <FONT Color=gray>' ''oppure più brevemente:''</font>
 
  <FONT Color=gray>' ''oppure più brevemente:''</font>
  Print String@(Pointer@(p2))
+
  Print String@(Pointer@(p2 + 32))
  Print "======================="
+
  Print "======================="
 
      
 
      
 
      
 
      
  <FONT Color=gray>' ''Per poter ricavare i valori contenuti nella terza varibile di tipo "STRUTTURA", bisognerà ottenere il terzo indirizzo di memoria,''
+
  <FONT Color=gray>' ''Per poter ricavare i valori contenuti nella terza varibile di tipo "STRUTTURA", bisognerà ottenere il terzo indirizzo di memoria, che è posto al 17° byte (indice 16) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]". Infatti un "Puntatore" occupa 8 byte di memoria.''</font>
' ''che è posto al 17° byte (indice 16) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]". Infatti un "Puntatore" occupa 8 byte di memoria.''</font>
+
  p3 = Pointer@(p + '''8''')
  p = p + 8
+
  Print p3
  p3 = Pointer@(p)
+
  <FONT Color=gray>' ''Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore a tale prima variabile spostandoci al 25° byte nell'area di memoria del "Puntatore":''</font>
  Print p3
+
  Print Byte@(p3 + '''24''')
  <FONT Color=gray>' ''Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore"''
+
  <FONT Color=gray>' ''Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA", ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):''</font>
' ''a tale prima variabile spostandoci al 25° byte nell'area di memoria del "Puntatore":''</font>
+
  Print Short@(p3 + '''26''')
  p3 = p3 + 24
 
  Print Byte@(p3)
 
  <FONT Color=gray>' ''Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA",''
 
' ''ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):''</font>
 
  p3 = p3 + 2
 
  Print Short@(p3)
 
 
  <FONT Color=gray>' ''Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:''</font>
 
  <FONT Color=gray>' ''Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:''</font>
  p3 = p3 + 2
+
  Print Int@(p3 + '''28''')
  Print Int@(p3)
 
 
  <FONT Color=gray>' ''Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".''
 
  <FONT Color=gray>' ''Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".''
  ' ''Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore''
+
  ' ''Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore della Stringa, e successivamente il Puntatore alla Stringa.''</font>
' ''della Stringa, e successivamente il Puntatore alla Stringa:''</font>
+
  ps = Pointer@(p3 + '''32''')
  p3 = p3 + 4
+
  Print String@(ps)
  ps = Pointer@(p3)
 
  Print String@(ps)
 
 
  <FONT Color=gray>' ''oppure più brevemente:''</font>
 
  <FONT Color=gray>' ''oppure più brevemente:''</font>
  Print String@(Pointer@(p3))
+
  Print String@(Pointer@(p3 + 32))
 
 
<FONT Color=gray>' ''A scopo didattico mostriamo il tipo di variabile assunto dalla originaria variabile "ob":''</font>
 
  Print Object.Type(ob)
 
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 05:14, 10 set 2022

Un vettore è sostanzialmente un Oggetto, nella cui area di memoria sono contenuti dati del medesimo tipo, ossia che occupano la medesima quantità di memoria (tutti Byte, o tutti Short, o tutti Integer, oppure tutti appartenenti ad un medesimo tipo di Oggetti e così via).

I vettori mettono a disposizione, fra l'altro, la Proprietà ".Data", che restituisce un Puntatore (ossia l'indirizzo di memoria) ai dati contenuti dal vettore medesimo.

E' possibile spostandoci lungo l'area di memoria puntata da tale Puntatore secondo la quantità di memeoria occupata dal tipo di vettore ("Byte[]", "Short[]", etc), leggere i valori contenuti dalla variabile vettoriale.

Conoscere con il Puntatore i valori di un vettore del tipo numerico

In un array del tipo nativo numerico i valori in esso contenuti sono allocati sin dal primo byte dell'area di memoria del vettore medesimo. I valori ovviamente sono posti ad una distanza l'uno dall'altro sulla base della quantità di memoria occupata dal tipo di valore.

Mostriamo un semplice esempio con un vettore di tipo Integer():

Public Sub Main()
 
 Dim ii As Integer[] = [2, 22, 222, 2222, 22222, 222222, 2222222]
 Dim i As Integer

 For i = 0 To ii.Max
' Dereferenziamo il puntatore per ottenere il valore contenuto dalla locazione di memoria puntata.
' Trattandosi in questo esempio di un vettore di tipo "Intero", spostiamo il puntatore interno all'area di memoria pari al numero di byte di memoria occupata dal tipo "Intero".
    Print i, Int@(ii.Data + (SizeOf(gb.Integer) * i))
 Next

End


Conoscere con il Puntatore i valori di un vettore del tipo di un Oggetto

Dereferenziando il Puntatore ai dati di un vettore di Oggetti attraverso la sua Proprietà ".Data", vedremo che ogni 8 byte (a partire ovviamente da quello di indice 0, ossia il primo byte) sono conservati gli indirizzi di memoria ove sono contenuti gli Oggetti in ciascun elemento del vettore predetto. Un elemento di un vettore di Oggetti è sostanzialmente un Puntatore ad un indirizzo di memoria dell'Oggetto contenuto dal vettore.

Sarà dunque necessario dereferenziare ognuno di quegli indirizzi di memoria per ottenere i valori contenuti dagli Oggetti. Tali valori sono individuabili a cominciare dal 25° byte (indice 24).

Mostriamo un esempio con un vettore di tipo "Struttura[]":

Public Struct STRUTTURA
  b As Byte
  sh As Short
  i As Integer
  s As String
End Struct


Public Sub Main()

 Dim sstt As New STRUTTURA[]
 Dim sr As STRUTTURA
 Dim p, p1, p2, p3, ps As Pointer
 Dim st As Stream
 Dim j, b As Byte

 With sr = New STRUTTURA
   .b = 1
   .sh = 11
   .i = 111
   .s = "sr num.1"
 End With
 sstt.Push(sr)

 With sr = New STRUTTURA
   .b = 2
   .sh = 22
   .i = 222
   .s = "sr num.2"
 End With
 sstt.Push(sr)

 With sr = New STRUTTURA
   .b = 3
   .sh = 33
   .i = 333
   .s = "sr num.3"
 End With 
 sstt.Push(sr)

 p = sstt.data

' Dereferenziamo il puntatore al vettore di tipo STRUTTURA[]:
 st = Memory p For Read
' Andiamo a leggerne i dati byte per byte. Noteremo che ci sono tre valori - che cominciano rispettivamente all'indice 0, 8 e 16 - i quali si riferiscono agli indirizzi di memoria delle tre variabili di tipo "STRUTTURA" contenuti dal vettore di tipo "STRUTTURA[]".
' Essendo tre puntatori, leggeremo In totale 3 * 8 byte: ossia 3 variabili per la quantità di byte di memoria occupata da un "Puntatore":
 For j = 0 To (sstt.Count * SizeOf(gb.Pointer)) - 1
   Read #st, b
   Print j;; Hex(b, 2)
 Next
 st.Close
 Print "============="
    
' Per poter ricavare i valori contenuti nella prima varibile di tipo "STRUTTURA", bisognerà ottenere il primo indirizzo di memoria, che è posto al primo byte (indice 0) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]".
' Utilizziamo la funzione di dereferenziazione di un "Puntatore di Puntatore".
 p1 = Pointer@(p)
 Print p1
 
' Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore a tale prima variabile spostandoci al 25° byte (indice 24) nell'area di memoria del "Puntatore":
 Print Byte@(p1 + 24)
' Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA", ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):
 Print Short@(p1 + 26)
' Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:
 Print Int@(p1 + 28)
' Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".
' Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore della Stringa, e successivamente il Puntatore alla Stringa:
 ps = Pointer@(p1 + 32)
 Print String@(ps)
' oppure più brevemente:
 Print String@(Pointer@(p1 + 32))
 Print "======================="


' Per poter ricavare i valori contenuti nella seconda varibile di tipo "STRUTTURA", bisognerà ottenere il secondo indirizzo di memoria, che è posto al 9° byte (indice 8) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]". Infatti un "Puntatore" occupa 8 byte di memoria.
 p = p + 8
 p2 = Pointer@(p)
 Print p2   
' Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore" a tale prima variabile spostandoci al 25° byte (indice 24) nell'area di memoria del "Puntatore":
 Print Byte@(p2 + 24)
' Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA", ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):
 Print Short@(p2 + 26)
' Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:
 Print Int@(p2 + 28)
' Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".
' Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore della Stringa, e successivamente il Puntatore alla Stringa.
 ps = Pointer@(p2 + 32)
 Print String@(ps)
' oppure più brevemente:
 Print String@(Pointer@(p2 + 32))
 Print "======================="
   
   
' Per poter ricavare i valori contenuti nella terza varibile di tipo "STRUTTURA", bisognerà ottenere il terzo indirizzo di memoria, che è posto al 17° byte (indice 16) dell'area di memoria occupata dal vettore di tipo "STRUTTURA[]". Infatti un "Puntatore" occupa 8 byte di memoria.
 p3 = Pointer@(p + 8)
 Print p3
' Per ottenere i valori contenuti dalla prima varibile di tipo "STRUTTURA", bisognerà dereferenziare il "Puntatore a tale prima variabile spostandoci al 25° byte nell'area di memoria del "Puntatore":
 Print Byte@(p3 + 24)
' Tenendo conto in questo caso del necessario allineamento dei membri della varibile di tipo "STRUTTURA", ci spostiamo di 2 byte in avanti per leggere il membro di tipo "Corto" (quindi al 27° byte):
 Print Short@(p3 + 26)
' Dato che lo "Short" occupa 2 byte di memoria, ci spostiamo di altri 2 byte in avanti, e dereferziamo il dato per leggere il valore contenuto dal terzo membro:
 Print Int@(p3 + 28)
' Poiché l'Intero occupa 4 byte di memoria, ci spostiamo pdi 4 byte in avanti per leggere il dato della "Stringa".
' Poiché una variabile di tipo "Stringa" è sostanzialmente un "Puntatore", dovremo prima dereferenziare quel Puntatore al Puntatore della Stringa, e successivamente il Puntatore alla Stringa.
 ps = Pointer@(p3 + 32)
 Print String@(ps)
' oppure più brevemente:
 Print String@(Pointer@(p3 + 32))

End