unsafe and fixed block

   
  

public class MyValue
{
    public int id;
    public MyValue(int id) { this.id = id; }
}
   
class UnsafeClassApp
{
    unsafe public static void Swap(int* pi, int* pj)
    {
        int tmp = *pi;
        *pi = *pj;
        *pj = tmp;
    }
   
    static void Main(string[] args)
    {
        MyValue i = new MyValue(123);
        MyValue j = new MyValue(456);
        Console.WriteLine("Before Swap:	i = {0}, j = {1}", i.id, j.id);
   
        unsafe
        {
             (int* pi = &i.id, pj = &j.id)
            {
                Swap(pi, pj);
            }
        }
   
        Console.WriteLine(
            "After Swap:	i = {0}, j = {1}", i.id, j.id);
    }
}

   
     


Use unsafe method to clone array

public struct MyValue
{
public int id;
public MyValue(int id) { this.id = id; }
}
class ClassAddressApp
{
unsafe public static MyValue[] CloneMyValues(MyValue[] box)
{
MyValue[] ret = new MyValue[box.Length];
fixed (MyValue* src = box, dest = ret)
{
MyValue* pSrc = src;
MyValue* pDest = dest;
for (int index = 0; index < box.Length; index++) { *pDest = *pSrc; pSrc++; pDest++; } } return ret; } static void Main(string[] args) { MyValue[] box = new MyValue[2]; box[0] = new MyValue(1); box[1] = new MyValue(2); MyValue[] bag = CloneMyValues(box); foreach (MyValue i in bag) { Console.WriteLine(i.id); } } } [/csharp]

object pointer

   
  

using System;

public struct MyValue
{
    public int id;
    private decimal price;
    public MyValue(int id, decimal price) 
    { 
        this.id = id; 
        this.price = price;
    }
    public void Foo() { Console.WriteLine("Foo"); }
}
   
class DerefMemberApp
{
    static void Main(string[] args)
    {
        MyValue i = new MyValue(123, 45.67m);
   
        unsafe
        {
            MyValue* pi = &amp;i;
            (*pi).Foo();
            pi->Foo();
   
            Console.WriteLine("id = {0}", pi->id);
        }
    }
}

   
     


Address and size of pointer object

   
  
using System;

class MainEntryPoint {
    static unsafe void Main() {
        int x = 10;
        short y = -1;
        byte y2 = 4;
        double z = 1.5;
        int* pX = &amp;x;
        short* pY = &amp;y;
        double* pZ = &amp;z;

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

        Console.ReadLine();
    }
}

   
     


Unsafe code: get data type size

   
 
   using System;

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

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

   
  

using System;

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

        Console.WriteLine("Address of amount1 is 0x{0:X}", (uint)&amp;amount1);
        Console.WriteLine("Address of amount2 is 0x{0:X}", (uint)&amp;amount2);
        Console.WriteLine("Address of pAmt is 0x{0:X}", (uint)&amp;pointerStruct);
        Console.WriteLine("Address of pDollars is 0x{0:X}", (uint)&amp;pDollars);
        Console.WriteLine("Address of pCents is 0x{0:X}", (uint)&amp;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)&amp;pCents);
        Console.WriteLine("
Now with classes");

        MyClass amount3 = new MyClass();

        fixed (long* pDollars2 = &amp;(amount3.Dollars))
        fixed (byte* pCents2 = &amp;(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;
    }
}