Вы можете сделать то же самое в C # без небезопасного кода:
struct ArrayPointer<T>
{
private T[] array;
private int offset;
public ArrayPointer(T[] array) : this(array, 0)
{
}
private ArrayPointer(T[] array, int offset)
{
Debug.Assert(array != null);
Debug.Assert(offset >= 0);
Debug.Assert(offset < array.Length);
this.array = array;
this.offset = offset;
}
public static ArrayPointer<T> operator+(ArrayPointer<T> p1, int p2)
{
return new ArrayPointer<T>(p1.array, p1.offset + p2);
}
И так далее.Определите операторы для сложения, вычитания, увеличения, уменьшения, сравнения, индексации, преобразования из массивов и так далее.Тогда вы можете сказать:
int[] arr = whatever;
ArrayPointer<int> pointer = arr;
pointer+=2;
pointer--;
int x = pointer[3];
и т. Д.
Этот подход имеет много приятных свойств.Например, вы можете сделать отладочное утверждение, если вы когда-либо сравниваете p1> p2, когда p1 и p2 являются указателями на внутренности различных массивов.Это почти всегда ошибка в C, но ее трудно поймать.