Differenze tra le versioni di "Differenza fra Assegnazione a un Puntatore di un indirizzo di memoria e Dereferenziazione di un Puntatore"

Da Gambas-it.org - Wikipedia.
Riga 3: Riga 3:
 
='''Assegnazione''' di un indirizzo di memoria a un Puntatore=
 
='''Assegnazione''' di un indirizzo di memoria a un Puntatore=
 
La variabile di tipo "Puntatore" contiene un valore numerico che corrisponde all'indirizzo di memoria di un'altra variabile, ossia di un'area di memoria allocata automaticamente dal sistema - sulla base dei tipi di dati nativi, primitivi o complessi, previsti dal linguaggio di programmazione utilizzato - oppure con un numero arbitrario di byte da occupare stabilito dal codice.
 
La variabile di tipo "Puntatore" contiene un valore numerico che corrisponde all'indirizzo di memoria di un'altra variabile, ossia di un'area di memoria allocata automaticamente dal sistema - sulla base dei tipi di dati nativi, primitivi o complessi, previsti dal linguaggio di programmazione utilizzato - oppure con un numero arbitrario di byte da occupare stabilito dal codice.
 +
<BR>Più in particolare il valore numerico, contenuto dalla variabile di tipo ''Puntatore'', rappresenta l'indirizzo della cella di memoria ove è scritto il primo byte costituente il valore immagazzinato.
  
 
Nel '''primo caso''', sopra descritto, l'assegnazione al ''Puntatore'' dell'indirizzo di memoria di una variabile, già dichiarata, avviene con la funzione "VarPtr()".
 
Nel '''primo caso''', sopra descritto, l'assegnazione al ''Puntatore'' dell'indirizzo di memoria di una variabile, già dichiarata, avviene con la funzione "VarPtr()".
Riga 30: Riga 31:
  
 
='''Dereferenziazione''' di un Puntatore=
 
='''Dereferenziazione''' di un Puntatore=
Dereferenziare un ''Puntatore'' significa ''accedere'' all'area di memoria (variabile o area allocata arbitrariamente), da esso puntata in quanto ne possiede l'indirizzo di memoria del primo byte utile, ed estrarre i dati-byte immagazzinati in tale area.
+
Dereferenziare un ''Puntatore'' significa ''accedere'' all'area di memoria (variabile o area allocata arbitrariamente), da esso puntata, ed estrarre i dati-byte immagazzinati in tale area.
  
 
La dereferenziazione può avvenire con le [https://gambaswiki.org/wiki/cat/externfunc specifiche funzioni di dereferenziazione] native di Gambas.
 
La dereferenziazione può avvenire con le [https://gambaswiki.org/wiki/cat/externfunc specifiche funzioni di dereferenziazione] native di Gambas.

Versione delle 17:52, 10 set 2022

In questa pagina vedremo cosa significhi "Assegnare a un Puntatore un indirizzo di un'area allocata di memoria" e "Dereferenziare un Puntatore".

Assegnazione di un indirizzo di memoria a un Puntatore

La variabile di tipo "Puntatore" contiene un valore numerico che corrisponde all'indirizzo di memoria di un'altra variabile, ossia di un'area di memoria allocata automaticamente dal sistema - sulla base dei tipi di dati nativi, primitivi o complessi, previsti dal linguaggio di programmazione utilizzato - oppure con un numero arbitrario di byte da occupare stabilito dal codice.
Più in particolare il valore numerico, contenuto dalla variabile di tipo Puntatore, rappresenta l'indirizzo della cella di memoria ove è scritto il primo byte costituente il valore immagazzinato.

Nel primo caso, sopra descritto, l'assegnazione al Puntatore dell'indirizzo di memoria di una variabile, già dichiarata, avviene con la funzione "VarPtr()".
Esempio:

Dim i As Integer
Dim p As Pointer

p = VarPtr(i)

Nel secondo caso l'assegnazione dell'indirizzo di memria di un'area allocata, avente dimensioni stabilite arbitrariamente dal codice, avviene con la funzione "Alloc()".
Esempio:

Dim i As Integer
Dim p As Pointer

p = Alloc(SizeOf(gb.Byte), 8)

Ci può essere un altro caso, in cui l'assegnazione di un indirizzo di memoria di un variabile o di un'area comunque allocata avviene tra Puntatori.
Esempio:

Dim p1, p2 As Pointer

p1 = VarPtr(i)

p2 = p1

oppure ad esempio nel caso di un vettore si può assegnare al Puntatore quanto ritornato dalla Proprietà ".Data" del vettore:

p = vettore.Data

In questo terzo caso va ricordato che "non" avviene una copia dei dati-byte presenti in un'area di memoria a un'altra, bensì il secondo Puntatore punterà anch'esso all'indirizzo di memoria puntato dal primo Puntatore.

Dereferenziazione di un Puntatore

Dereferenziare un Puntatore significa accedere all'area di memoria (variabile o area allocata arbitrariamente), da esso puntata, ed estrarre i dati-byte immagazzinati in tale area.

La dereferenziazione può avvenire con le specifiche funzioni di dereferenziazione native di Gambas.
Esempio:

Dim i As Integer
Dim p As Pointer

i = 1000
p = VarPtr(i)

' Dereferenzia il "Puntatore" con la funzione "Int@()", giacché il tipo di dato della variabile, contenente il valore numerico "1000", è di tipo "Integer":
Print Int@(i)

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:

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

i = 1000
p = VarPtr(i)

st = Memory p for Read
read #st, n
st.Close
Print n