指针算术

指针中的加法和减法与整数的工作方式不同。当指针递增或递减时,它指向的地址会增加或减少指示类型的大小。

例如,类型 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));