Get variable address in unsafe mode

image_pdfimage_print
   
  

using System;

public class MainEntryPoint {
    public static unsafe void Main() {
        Console.WriteLine("Size of Currency struct is " + sizeof(MyStruct));
        MyStruct amount1, amount2;
        MyStruct* pointerStruct = &amount1;
        long* pDollars = &(pointerStruct->Dollars);
        byte* pCents = &(pointerStruct->Cents);

        Console.WriteLine("Address of amount1 is 0x{0:X}", (uint)&amount1);
        Console.WriteLine("Address of amount2 is 0x{0:X}", (uint)&amount2);
        Console.WriteLine("Address of pAmt is 0x{0:X}", (uint)&pointerStruct);
        Console.WriteLine("Address of pDollars is 0x{0:X}", (uint)&pDollars);
        Console.WriteLine("Address of pCents is 0x{0:X}", (uint)&pCents);
        pointerStruct->Dollars = 20;
        *pCents = 50;
        Console.WriteLine("amount1 contains " + amount1);
        --pointerStruct;   
        Console.WriteLine("amount2 has address 0x{0:X} and contains {1}",
           (uint)pointerStruct, *pointerStruct);
        MyStruct* pTempCurrency = (MyStruct*)pCents;
        pCents = (byte*)(--pTempCurrency);
        Console.WriteLine("Address of pCents is now 0x{0:X}", (uint)&pCents);
        Console.WriteLine("
Now with classes");

        MyClass amount3 = new MyClass();

        fixed (long* pDollars2 = &(amount3.Dollars))
        fixed (byte* pCents2 = &(amount3.Cents)) {
            Console.WriteLine("amount3.Dollars has address 0x{0:X}", (uint)pDollars2);
            Console.WriteLine("amount3.Cents has address 0x{0:X}", (uint)pCents2);
            *pDollars2 = -100;
            Console.WriteLine("amount3 contains " + amount3);
        }
    }
}

struct MyStruct {
    public long Dollars;
    public byte Cents;

    public override string ToString() {
        return "$" + Dollars + "." + Cents;
    }
}

class MyClass {
    public long Dollars;
    public byte Cents;

    public override string ToString() {
        return "$" + Dollars + "." + Cents;
    }
}