public unsafe static void PointDemo() { int[] arry = null; arry = new int[10]; fixed(int *pi = arry) { Console.WriteLine(@"array = 0x{0:x}", (int)pi); } int[] intArr = { 12, 13, 14, 15, 16 }; for (int i = 0; i < intArr.Length; i++) { Console.WriteLine(@"array = 0x{0:x}", intArr[i]); } fixed(int *p = intArr) { Console.WriteLine((int)p); } CPoint pt = new CPoint(); pt.X = 5; pt.Y = 6; // Pin pt in place: fixed(int *p = &pt.X) { SquareIntPointer(p); } fixed(int *p = &pt.X) { *p = 1; } double[] arr = { 0, 1.5, 2.3, 3.4, 4.0, 5.9 }; fixed(int *p1 = &pt.X) { fixed(double *p2 = &arr[5]) { // Do something with p1 and p2. } } fixed(int *p1 = &pt.X) { fixed(double *p2 = &arr[5]) { // Do something with p1 and p2. } } }
public static unsafe void UseAndPinPoint() { CPoint pt = new CPoint { X = 5, Y = 6 }; // pin pt in place so it will not be moved or GC-ed. fixed(int *p = &pt.X) { // Use int* variable here! } // pt is now unpinned, and ready to be GC-ed once the method completes. Console.WriteLine(@"Point is: {0}", pt); }