指標算術
指標中的加法和減法與整數的工作方式不同。當指標遞增或遞減時,它指向的地址會增加或減少指示型別的大小。
例如,型別 int
(System.Int32
的別名)的大小為 4.如果 int
可以儲存在地址 0 中,則後續的 int
可以儲存在地址 4 中,依此類推。在程式碼中:
var ptr = (int*)IntPtr.Zero;
Console.WriteLine(new IntPtr(ptr)); // prints 0
ptr++;
Console.WriteLine(new IntPtr(ptr)); // prints 4
ptr++;
Console.WriteLine(new IntPtr(ptr)); // prints 8
類似地,型別 long
(System.Int64
的別名)的大小為 8.如果 long
可以儲存在地址 0 中,則後續的 long
可以儲存在地址 8 中,依此類推。在程式碼中:
var ptr = (long*)IntPtr.Zero;
Console.WriteLine(new IntPtr(ptr)); // prints 0
ptr++;
Console.WriteLine(new IntPtr(ptr)); // prints 8
ptr++;
Console.WriteLine(new IntPtr(ptr)); // prints 16
void
型別是特殊的,void
指標也很特殊,當型別未知或無關緊要時,它們用作全能指標。由於它們的大小不可知性,void
指標不能遞增或遞減:
var ptr = (void*)IntPtr.Zero;
Console.WriteLine(new IntPtr(ptr));
ptr++; // compile-time error
Console.WriteLine(new IntPtr(ptr));
ptr++; // compile-time error
Console.WriteLine(new IntPtr(ptr));