指针算术
指针中的加法和减法与整数的工作方式不同。当指针递增或递减时,它指向的地址会增加或减少指示类型的大小。
例如,类型 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));