Добавьте смещение к IntPtr

Почему бы не получить лучший из обоих миров: сделайте контейнер интеллектуальных указателей (такой как boost::shared_ptr или std::shared_ptr ). Вы не должны управлять памятью, и Вы не должны иметь дело с большими операциями копии.

36
задан Soner Gönül 27 July 2015 в 11:14
поделиться

4 ответа

Я предлагаю вам использовать ToInt64 () и long для выполнения ваших вычислений. Таким образом вы избежите проблем с 64-битной версией .NET framework.

IntPtr ptr = new IntPtr(oldptr.ToInt64() + 2);

Это добавляет немного накладных расходов на 32-битную систему, но это безопаснее.

39
ответ дан 27 November 2019 в 05:17
поделиться

Для арифметики указателей в C # вы должны использовать правильные указатели внутри unsafe context:

class PointerArithmetic
{
    unsafe static void Main() 
    {
        int* memory = stackalloc int[30];
        long* difference;
        int* p1 = &memory[4];
        int* p2 = &memory[10];

        difference = (long*)(p2 - p1);

        System.Console.WriteLine("The difference is: {0}", (long)difference);
    }
}

Тип IntPtr предназначен для передачи дескрипторов или указателей, а также для маршалинга на языки, поддерживающие указатели. Но это не для арифметики указателей.

9
ответ дан 27 November 2019 в 05:17
поделиться

Я обнаружил, что могу избежать операций с указателями, используя Marshal.ReadByte (), Marshal. ReadInt16 () и др. Методы. Эта группа методов позволяет указать смещение при выпуске в IntPtr ...

ReadInt16 () и др. Методы. Эта группа методов позволяет указать смещение при выпуске в IntPtr ...

ReadInt16 () и др. Методы. Эта группа методов позволяет указать смещение при выпуске в IntPtr ...

9
ответ дан 27 November 2019 в 05:17
поделиться

Вы можете использовать метод расширения:

public static IntPtrExtensions {
    public static IntPtr Add( this IntPtr ptr, int offSet ) {
        IntPtr ret = new IntPtr( ptr.ToInt64() + offSet );
        return ret;
    }
}
// ... somewhere else ...
IntPtr pointer = GetHandle().Add( 15 );
2
ответ дан 27 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: