2009-07-23 11 views
12

En Delphi:dirección de puntero delphi

¿Cómo puedo obtener la dirección (0x2384293) un puntero apunta a?

var iValue := Integer; 
    iptrValue := PInteger; 

implementation 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    iptrValue := @iValue; 
    iValue := 32342; 
    //Should return the same value: 
    Edit1.Text := GetAddressOf(iptrValue); 
    Edit2.Text := GetAddressOf(iValue); 

Entonces, ¿qué es en realidad :) GetAddress

+0

GetAddressOf no existe. fue pseudocódigo como se establece en "en realidad" :) – Acron

Respuesta

26

Para obtener obtener la dirección de algo, utilice el operador @ o la función Addr. Ya has demostrado el uso correcto de eso. Obtuvo la dirección de iValue y la almacenó en iptrValue.

Para mostrar una dirección, puede usar la función Format para convertir un valor de puntero en una cadena. Utilice la cadena %p formato:

Edit1.Text := Format('%p -> %p -> %d', [@iptrValue, iptrValue, iptrValue^]); 

que mostrará la dirección de la variable iptrValue, a continuación, la dirección almacenada en esa variable, y luego el valor almacenado en esa dirección.

La declaración de la variable iptrValue reserva algunos bytes en memoria y asocia un nombre con ellos. Supongamos que la dirección del primer byte es $00002468:

 iptrValue 
     +----------+ 
$2468: |   | 
     +----------+ 

La declaración iValue se reserva otra pieza de la memoria, y es probable que sea adyacente a la memoria de la declaración anterior. Desde iptrValue es de cuatro bytes de ancho, la dirección de iValue sería $0000246C:

 iValue 
     +----------+ 
$246c: |   | 
     +----------+ 

Las cajas que he dibujado están vacías por ahora porque no hemos hablado de qué valores tienen esas variables. Solo hemos discutido las direcciones de las variables.Ahora que el código ejecutable: Usted escribe @iValue y almacenar el resultado en iptrValue, para que pueda obtener esto:

 iptrValue 
     +----------+ +----------+ 
$2468: | $246c |--->|   | 
     +----------+ +----------+ 
     iValue 
     +----------+ 
$246c: |   | 
     +----------+ 


Next, you assign 32342 to `iValue`, so your memory looks like this: 


     iptrValue 
     +----------+ +----------+ 
$2468: | $246c |--->| 32342 | 
     +----------+ +----------+ 
     iValue 
     +----------+ 
$246c: | 32342 | 
     +----------+ 

Por último, al mostrar los resultados de la función Format desde arriba, que se vería este valor:

00002468 -> 0000246C -> 32342 
+2

¡Explicación impresionante! – Acron

5

Justo lo echó a un entero :)

IIRC, también hay un especificador de formato de cadena (% x% p?) Que se Automágicamente formatearlo como una cadena hexagonal de 8 caracteres.

3

GetAddressOf() devolverá la dirección de la variable.

GetAddressOf(iptrValue) - the address of the iptrValue 
GetAddressOf(iValue) - the address of iValue 

Lo que desea es el valor del puntero. Para hacerlo, coloque el puntero en un tipo entero sin signo (Longword si no recuerdo mal). Entonces puedes convertir ese entero en una cadena.

2

En realidad, es un ULONG que necesita:

procedure TForm1.Button1Click(Sender: TObject); 
var iValue : Integer; 
    iAdrValue : ULong; 
    iptrValue : PInteger; 
begin 
    iValue := 32342; 
    iAdrValue := ULong(@iValue); 
    iptrValue := @iValue; 

    //Should return the same value: 
    Edit1.Text := IntToStr(iAdrValue); 
    Edit2.Text := IntToStr(ULong(iptrValue)); 
    Edit3.Text := IntToStr((iptrValue^); // Returns 32342 
end; 

no he encontrado la función GetAddressOf en Delphi 2006. Parece ser una función VB?

3

Aquí es mi propio ejemplo de la función de dirección:

function GetAddressOf(var X) : String; 
Begin 
    Result := IntToHex(Integer(Pointer(@X)), 8); 
end; 

ejemplo de uso de los mismos datos de 2 variables:

type 
    TMyProcedure = procedure; 

procedure Proc1; 
begin 
    ShowMessage('Hello World'); 
end; 

var 
    P : PPointer; 
    Proc2 : TMyProcedure; 
begin 
    P := @@Proc2; //Storing address of pointer to variable 
    P^ := @Proc1; //Setting address to new data of our stored variable 
    Proc2; //Will execute code of procedure 'Proc1' 
end; 
Cuestiones relacionadas