指標算術

指標中的加法和減法與整數的工作方式不同。當指標遞增或遞減時,它指向的地址會增加或減少指示型別的大小。

例如,型別 intSystem.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

類似地,型別 longSystem.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));