Для # 2 оператор &
будет работать так же, как и в C. Если переменная не находится в стеке, вам может потребоваться использовать оператор fixed
, чтобы зафиксировать ее во время работы, чтобы однако сборщик мусора не перемещает его.
Для # 1 ссылочные типы сложнее: вам нужно будет использовать GCHandle
, а ссылочный тип должен быть кратковременным, то есть иметь определенный макет памяти и быть побитовым для копирования.
Чтобы получить доступ к адресу в виде числа, вы можете преобразовать тип указателя в IntPtr
(целочисленный тип, определенный по размеру как указатель), а оттуда в uint
или ulong
( в зависимости от размера указателя базовой машины).
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();
}
}