Differenze tra le versioni di "Dereferenziare un Puntatore di Puntatore con le funzioni specifiche di dereferenziazione e con i Memory Stream"
(9 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Un ''Puntatore'' di ''Puntatore'' è una variabile di tipo ''Puntatore'' che punta ad un'altra variabile di tipo ''Puntatore''. E' pertanto | + | 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'<I>indirizzo di memoria</i> di una variabile che a sua volta contiene l'<I>indirizzo di memoria</i> di una variabile contenente un valore, un dato, oppure di un'area riservata di memoria. |
− | + | Per "''dereferenziare''" <SUP>[[[#Note|Nota 1]]]</sup> un ''Puntatore'' di ''Puntatore'', esistono almeno due modalità: | |
− | Per dereferenziare un ''Puntatore'' di ''Puntatore'', esistono almeno due modalità: | ||
* mediante le apposite funzioni di dereferenziazione posseduta dai tipi nativi di dati; | * mediante le apposite funzioni di dereferenziazione posseduta dai tipi nativi di dati; | ||
− | * mediante i ''Memory Stream''. | + | * mediante i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]''. |
+ | Le funzioni di dereferenziazione sono quelle che derefenziano il ''Puntatore'' nel relativo tipo di dato, al quale esse si riferiscono. | ||
+ | <BR>Esse sono: [[Byte@|Byte@()]]", "[[Boolean@|Bool@()]]", [[Short@|Short@()]]", "[[Single@|Single@()]]", "[[Int@|Int@()"]], "[[Long@|Long@()]]", "[[Float@|Float@()]]", "[[String@|String@()]]", "[[Pointr@|Pointer@()]]". | ||
− | |||
− | |||
− | + | Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione "VarPtr()" un ''Puntatore'' di ''Puntatore'', e poi si percorrerà il cammino al contrario riottenendo il valore puntato da un ''Puntatore'' puntato a sua volta da un ''Puntataore'', così come lo abbiamo realizzato, nella prima modalità con una delle suddette funzioni di dereferenziazione, nella seconda modalità con i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]''. Ad ogni modo, in entrambe le modalità di dereferenziazione il processo avviene con due fasi: | |
− | Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione | + | * dereferenziazione del "Puntatore" di "Puntatore", ottenendo il primo "Puntatore" (ossia l'indirizzo di memoria della variabile contenente il dato iniziale). Se si intende utilizzare una specifica funzione di dereferenziazione in questa prima fase, va usata la funzione "[https://gambaswiki.org/wiki/lang/pointer@?l=it Pointer@()]". |
− | * dereferenziazione del "Puntatore" di "Puntatore", ottenendo il primo "Puntatore" (ossia l'indirizzo di memoria della variabile | ||
* dereferenziazione del "Puntatore", ottenendo il valore contenuto dalla variabile contenente il dato di partenza. | * dereferenziazione del "Puntatore", ottenendo il valore contenuto dalla variabile contenente il dato di partenza. | ||
− | + | Public Sub Main() | |
Dim b, n As Byte | Dim b, n As Byte | ||
Riga 20: | Riga 18: | ||
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 | |
− | <FONT Color=gray>' '' | + | <FONT Color=gray>' ''Crea il primo "Puntatore", che punta all'indirizzo di memoria della varianbile "b":''</font> |
− | + | p = VarPtr(b) | |
− | <FONT Color=gray>' '' | + | <FONT Color=gray>' ''Crea il secondo "Puntatore", che punta all'indirizzo di memoria della varianbile "p":''</font> |
− | + | p2 = VarPtr(p) | |
− | <FONT Color=gray>' ''Ora, | + | <FONT Color=gray>' ''Ora, dereferenzia il "Puntatore" di "Puntatore" con la funzione "Pointer@()":''</font> |
− | + | ritP = <FONT Color=red>Pointer@</font>(p2) | |
− | |||
− | |||
+ | <FONT Color=gray>' ''Quindi dereferenzia il "Puntatore" ottenuto, per ricavare il valore contenuto iniziale della variabile "b":''</font> | ||
+ | Print <FONT Color=green>Byte@</font>(ritP) | ||
− | |||
− | |||
− | + | <FONT Color=gray>' ''Ora, invece, mostra come dereferenziare il "Puntatore" di "Puntatore" con i "[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]":''</font> | |
− | + | st2 = Memory p2 For Read | |
− | + | Read #st2, sP | |
− | + | <FONT Color=gray>' ''Quindi dereferenzia il "Puntatore" ottenuto, per ricavare il valore contenuto iniziale della variabile "b":''</font> | |
− | + | 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''. |
Versione attuale delle 15:46, 12 nov 2024
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 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@()".
Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione "VarPtr()" un Puntatore di Puntatore, e poi si percorrerà il cammino al contrario riottenendo il valore puntato da un Puntatore puntato a sua volta da un Puntataore, così come lo abbiamo realizzato, 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 contenente il dato iniziale). Se si intende utilizzare una specifica funzione di dereferenziazione in questa prima fase, va usata la funzione "Pointer@()".
- 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 ' Crea il primo "Puntatore", che punta all'indirizzo di memoria della varianbile "b": p = VarPtr(b) ' Crea il secondo "Puntatore", che punta all'indirizzo di memoria della varianbile "p": p2 = VarPtr(p) ' Ora, dereferenzia il "Puntatore" di "Puntatore" con la funzione "Pointer@()": ritP = Pointer@(p2) ' Quindi dereferenzia il "Puntatore" ottenuto, per ricavare il valore contenuto iniziale della variabile "b": Print Byte@(ritP) ' Ora, invece, mostra come dereferenziare il "Puntatore" di "Puntatore" con i "Memory Stream": st2 = Memory p2 For Read Read #st2, sP ' Quindi dereferenzia il "Puntatore" ottenuto, per ricavare il valore contenuto iniziale della variabile "b": 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.