"Interfere" isn't exactly the right word, it is one of the GC's important duties to find the pointer back and update its value.
Finding the pointer first is the most important job, that's how the GC knows that the array is still used and should not be collected. The jitter plays a very important role in this. When it translate the IL to machine code it performs an obvious and very visible job of generating the code. But also does another job that completely invisible, it generates a table that describes exactly where object references are stored inside the method. It contains table entries for both CPU registers and stack frame locations, indexed by code address. The GC needs this table to find the object reference back.
So from there, after building the object graph, determining what objects are still live and compacting the heap, the last thing it does is update the pointer value if the object was moved. Patching the stack location or the stored CPU register value. So that, after the code resumes, it now uses the correct pointer again.