一个数组反转的经典例子

int[] a = { 1, 2, 3, 4, 5, 6 };
ref int ptr = ref Unsafe.Add<int>(ref MemoryMarshal.GetArrayDataReference<int>(a), 0);
ref int ptr2 = ref Unsafe.Add<int>(ref Unsafe.Add<int>(ref ptr, a.Length), -1);
do
{
    int t = ptr;
    ptr = ptr2;
    ptr2 = t;
    ptr = ref Unsafe.Add<int>(ref ptr, 1);
    ptr2 = ref Unsafe.Add<int>(ref ptr2, -1);
 }
 while (Unsafe.IsAddressLessThan<int>(ref ptr, ref ptr2));

通过数组在内存上是顺序排列的,通过引用地址来进行反转

MemoryMarshal.GetArrayDataReference 来获取数组第一个内存地址

Unsafe.Add 来获取一个内存地址的偏移量(由于数组是顺序排列的,下一个内存地址一定是数组下一个数据)

Unsafe.IsAddressLessThan 该值指示指定的引用是否小于另一个指定的引用。