1.在这个例子里面p[-1]、p[-2]意思就是*(p-1),*(p-2),也就是当前指针的前2项的值。
你要明白在c#中,数组是放在堆中的,位置是不定的,因为虚拟机可能由于效率的考虑,随时根据当前情况从新排列堆中的实例。所以是不能够对其进行指针操作的,也就是你后来新建数组用p[-1]、p[-2]失败的原因。这里成功,是因为你是利用的stackalloc函数分配的空间,这是在堆上的,是不会被移动的,所以可以用指针操作。
2.fixed就是针对你上面遇到的问题而设计的,刚才说了,在堆中,虚拟机可能会改变实例的地址(堆中实例都是根据引用访问,虚拟机在移动实例地址以后会修改引用,保证你通过引用仍然能够访问到它)当你不希望虚拟机移动它的时候,就可以通过fixed告诉虚拟机。这样虚拟机就不会移动它,但是这样是会牺牲效率的,所以你的fixed的括号,尽量的不要涵盖过多的代码。在上面这个例子,你说数组不能p[-1]、p[-2]访问,如果你把它们用fixed括起来,就能够通过指针访问了,比如*(p-1)这样,因为此时它们在堆中的地址固定了,而且你还可以通过Console把它的具体地址显示出来。