Unsafe code: get data type size

image_pdfimage_print
   
 
   using System;

   class MainEntryPoint
   {
      static unsafe void Main()
      {
         int x=100;
         short y = -19;
         byte y2 = 45;
         double z = 31.5;
         int *pX = &x;
         short *pY = &y;
         double *pZ = &z;

         Console.WriteLine("Address of x is 0x{0:X}, size is {1}, value is {2}", (uint)&x, sizeof(int), x);
         Console.WriteLine("Address of y is 0x{0:X}, size is {1}, value is {2}", (uint)&y, sizeof(short), y);
         Console.WriteLine("Address of y2 is 0x{0:X}, size is {1}, value is {2}",(uint)&y2, sizeof(byte), y2);
         Console.WriteLine("Address of z is 0x{0:X}, size is {1}, value is {2}", (uint)&z, sizeof(double), z);
         Console.WriteLine("Address of pX=&x is 0x{0:X}, size is {1}, value is 0x{2:X}",(uint)&pX, sizeof(int*), (uint)pX);
         Console.WriteLine("Address of pY=&y is 0x{0:X}, size is {1}, value is 0x{2:X}",(uint)&pY, sizeof(short*), (uint)pY);
         Console.WriteLine("Address of pZ=&z is 0x{0:X}, size is {1}, value is 0x{2:X}",(uint)&pZ, sizeof(double*), (uint)pZ);

         *pX = 20;
         Console.WriteLine("After setting *pX, x = {0}", x);
         Console.WriteLine("*pX = {0}", *pX);

         pZ = (double*)pX;
         Console.WriteLine("x treated as a double = {0}", *pZ);
      }
   }


           
         
     


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;
    }
}

   
     


Accessing Structure Members with a Pointer

image_pdfimage_print
   
 
using System;
   
public struct Point2D {
    public int X;
    public int Y;
}
   
public class MyClass {
    public unsafe static void Main() {
        Point2D MyPoint;
        Point2D * PointerToMyPoint;
   
        MyPoint = new Point2D();
        PointerToMyPoint = &MyPoint;
        PointerToMyPoint->X = 100;
        PointerToMyPoint->Y = 200;
        Console.WriteLine("({0}, {1})", PointerToMyPoint->X, PointerToMyPoint->Y);
    }
}