Differenze tra le versioni di "Assegnare ad un Puntatore la rappresentazione numerica di un indirizzo di memoria contenuto da un altro Puntatore"

Da Gambas-it.org - Wikipedia.
 
Riga 2: Riga 2:
  
 
Tale indirizzo di memoria è un numero che è facilmente visibile in rappresentazione esadecimale in questo modo:
 
Tale indirizzo di memoria è un numero che è facilmente visibile in rappresentazione esadecimale in questo modo:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim p As Pointer
 
   Dim p As Pointer
 
   
 
   
  i = 999
+
  i = 999
 
   
 
   
  p = VarPtr(i)
+
  p = VarPtr(i)
 
   
 
   
  Print p;; CStr(p)
+
  Print p;; CStr(p)
 
   
 
   
  '''End'''
+
  End
 
Sappiamo che, per assegnare un'indirizzo di memoria, contenuto da un ''Puntatore'', ad un altra variabile di tipo ''Puntatore'', è sufficiente procedere con un normale assegnamento fra le due variabili ''Puntatore'':
 
Sappiamo che, per assegnare un'indirizzo di memoria, contenuto da un ''Puntatore'', ad un altra variabile di tipo ''Puntatore'', è sufficiente procedere con un normale assegnamento fra le due variabili ''Puntatore'':
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim p1, p2 As Pointer
 
   Dim p1, p2 As Pointer
 
   
 
   
  i = 999
+
  i = 999
 
   
 
   
  p1 = VarPtr(i)
+
  p1 = VarPtr(i)
 
   
 
   
  p2 = p1
+
  p2 = p1
 
   
 
   
  Print p1;; p2
+
  Print p1;; p2
 
   
 
   
  '''End'''
+
  End
 
 
  
  
 
E' possibile assegnare l'indirizzo di memoria, contenuto da una variabile ''Puntatore'', ad altra variabile ''Puntatore'' anche attraverso la diretta assegnazione della mera ''rappresentazione numerica'' dell'indirizzo di memoria medesimo:
 
E' possibile assegnare l'indirizzo di memoria, contenuto da una variabile ''Puntatore'', ad altra variabile ''Puntatore'' anche attraverso la diretta assegnazione della mera ''rappresentazione numerica'' dell'indirizzo di memoria medesimo:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
Riga 39: Riga 38:
 
   Dim s As String
 
   Dim s As String
 
   
 
   
  i = 999
+
  i = 999
 
   
 
   
  p1 = VarPtr(i)
+
  p1 = VarPtr(i)
 
   
 
   
 
  <FONT Color=gray>' ''Estrapoliamo il numero dell'indirizzo di memoria nella sua rappresentazione esadecimale:''</font>
 
  <FONT Color=gray>' ''Estrapoliamo il numero dell'indirizzo di memoria nella sua rappresentazione esadecimale:''</font>
  s = Cstr(p1)
+
  s = Cstr(p1)
 
   
 
   
 
  <FONT Color=gray>' ''Assegnamo direttamente il numero dell'indirizzo di memoria, dopo averlo convertito in decimale, all'altra variabile di tipo Puntatore:''</font>
 
  <FONT Color=gray>' ''Assegnamo direttamente il numero dell'indirizzo di memoria, dopo averlo convertito in decimale, all'altra variabile di tipo Puntatore:''</font>
  p2 = Val("&" & s)
+
  p2 = Val("&" & s)
 
   
 
   
 
  <FONT Color=gray>' ''Verifichiamo il risultato:''</font>
 
  <FONT Color=gray>' ''Verifichiamo il risultato:''</font>
  Print Int@(p2)
+
  Print Int@(p2)
 
   
 
   
  '''End'''
+
  End
  
 
Un'altra modalità simile alla precedente, convertendo l'indirizzo - contenuto dal Puntatore - in un valore di tipo ''Long'':
 
Un'altra modalità simile alla precedente, convertendo l'indirizzo - contenuto dal Puntatore - in un valore di tipo ''Long'':
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim p1, p2 As Pointer
 
   Dim p1, p2 As Pointer
Riga 61: Riga 60:
 
   Dim l As Long
 
   Dim l As Long
 
    
 
    
  i = 4444
+
  i = 4444
 
    
 
    
  p1 = VarPtr(i)
+
  p1 = VarPtr(i)
  Print p1
+
  Print p1
 
    
 
    
 
  <FONT Color=gray>' ''Converte l'indirizzo - contenuto dal Puntatore - in un valore di tipo "Long":''</font>
 
  <FONT Color=gray>' ''Converte l'indirizzo - contenuto dal Puntatore - in un valore di tipo "Long":''</font>
  l = CLong(p1)
+
  l = CLong(p1)
 
    
 
    
  p2 = l
+
  p2 = l
  Print p2
+
  Print p2
 
    
 
    
  Print Int@(p2)
+
  Print Int@(p2)
 
    
 
    
  Processus(l)
+
  Processus(l)
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure Processus(vl As Long)
+
  Private Procedure Processus(vl As Long)
 
    
 
    
 
   Dim p3 As Pointer
 
   Dim p3 As Pointer
Riga 90: Riga 89:
 
   Print Int@(p3)
 
   Print Int@(p3)
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 04:30, 8 giu 2024

Come è noto la variabile di tipo Puntatore contiene l'indirizzo di memoria di una variabile.

Tale indirizzo di memoria è un numero che è facilmente visibile in rappresentazione esadecimale in questo modo:

Public Sub Main()

 Dim i As Integer
 Dim p As Pointer

 i = 999

 p = VarPtr(i)

 Print p;; CStr(p)

End

Sappiamo che, per assegnare un'indirizzo di memoria, contenuto da un Puntatore, ad un altra variabile di tipo Puntatore, è sufficiente procedere con un normale assegnamento fra le due variabili Puntatore:

Public Sub Main()

 Dim i As Integer
 Dim p1, p2 As Pointer

 i = 999

 p1 = VarPtr(i)

 p2 = p1

 Print p1;; p2

End


E' possibile assegnare l'indirizzo di memoria, contenuto da una variabile Puntatore, ad altra variabile Puntatore anche attraverso la diretta assegnazione della mera rappresentazione numerica dell'indirizzo di memoria medesimo:

Public Sub Main()

 Dim i As Integer
 Dim p1, p2 As Pointer
 Dim s As String

 i = 999

 p1 = VarPtr(i)

' Estrapoliamo il numero dell'indirizzo di memoria nella sua rappresentazione esadecimale:
 s = Cstr(p1)

' Assegnamo direttamente il numero dell'indirizzo di memoria, dopo averlo convertito in decimale, all'altra variabile di tipo Puntatore:
 p2 = Val("&" & s)

' Verifichiamo il risultato:
 Print Int@(p2)

End

Un'altra modalità simile alla precedente, convertendo l'indirizzo - contenuto dal Puntatore - in un valore di tipo Long:

Public Sub Main()
 
 Dim p1, p2 As Pointer
 Dim i As Integer
 Dim l As Long
  
 i = 4444
  
 p1 = VarPtr(i)
 Print p1
  
' Converte l'indirizzo - contenuto dal Puntatore - in un valore di tipo "Long":
 l = CLong(p1)
  
 p2 = l
 Print p2
  
 Print Int@(p2)
  
 Processus(l)
  
End


Private Procedure Processus(vl As Long)
 
 Dim p3 As Pointer
 
 Print
 Print Hex(vl)
 
 p3 = vl
 
 Print Int@(p3)
 
End