Para # 2, el operador &
funcionará de la misma manera como en C. Si la variable no está en la pila, puede que tenga que utilizar una declaración fixed
a la clavija hacia abajo mientras se trabaja por lo que la basura el coleccionista no lo mueve, sin embargo.
Para el n. ° 1, los tipos de referencia son más complicados: necesitará un GCHandle
, y el tipo de referencia debe ser blittable, es decir, tener un diseño de memoria definido y ser copiable por bit.
Con el fin de acceder a la dirección como un número, puede convertir de un tipo de puntero a IntPtr
(un tipo entero definido para ser el mismo tamaño que un puntero), y de allí a uint
o ulong
(dependiendo del tamaño del puntero de la máquina subyacente).
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
class Blittable
{
int x;
}
class Program
{
public static unsafe void Main()
{
int i;
object o = new Blittable();
int* ptr = &i;
IntPtr addr = (IntPtr)ptr;
Console.WriteLine(addr.ToString("x"));
GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
addr = h.AddrOfPinnedObject();
Console.WriteLine(addr.ToString("x"));
h.Free();
}
}
# 2, que es fresco. pero ¿cómo puedes obtener la dirección de la memoria como una cadena? di int i; int * pi = & i; No puedo imprimirlo usando la consola.WriteLine (pi); Espero que se imprima algo como 0x0439ecc4. ¿Cualquier pista? –
Console.WriteLine ("0x" + pi.ToString ("x") imprimiría el valor hexadecimal –
@Hamish, pi.ToString ("x") aumenta el error de compilación. "Operator '.' No se puede aplicar al operando de tipo 'int *' " –