mark method as unsafe

class FixedArrayApp
{
unsafe public static void Foo(int* pa)
{
for (int* ip = pa; ip < (pa+5); ip++) { Console.Write("{0,-3}", *ip); } } static void Main(string[] args) { int[] ia = new int[5]{12,34,56,78,90}; unsafe { fixed (int* pa = ia) { Foo(pa); } } } } [/csharp]

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 = &amp;i.id, pj = &amp;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);
      }
   }