7 ответов:
это " родной (специфичный для платформы) размер целого числа."Это внутренне представлено как
void*но представляется как целое число. Вы можете использовать его всякий раз, когда вам нужно хранить неуправляемый указатель и не хотите использоватьunsafeкод.IntPtr.ZeroэффективноNULL(нулевой указатель).
Это тип значения, достаточно большой для хранения адреса памяти, используемого в собственном или небезопасном коде, но не может непосредственно использоваться в качестве адреса памяти в безопасном управляемом коде.
можно использовать
IntPtr.Sizeчтобы узнать, работаете ли вы в 32-битном или 64-битном процессе, так как это будет 4 или 8 байт соответственно.
вот пример:
Я пишу программу на C#, которая взаимодействует с высокоскоростной камеры. Камера имеет свой собственный драйвер, который получает изображения и загружает их в память компьютера автоматически.
поэтому, когда я готов принести последнее изображение в свою программу для работы, драйвер камеры предоставляет мне IntPtr туда, где изображение уже хранится в физической памяти, поэтому мне не нужно тратить время / ресурсы на создание другого блока памяти сохраните изображение, которое уже находится в памяти. IntPtr просто показывает мне, где изображение уже есть.
прямой перевод
An IntPtr это целое который имеет тот же размер, что и указатель.
вы можете использовать IntPtr для хранения значения указателя в типе без указателя. Эта функция важна в .NET, так как использование указателей очень подвержено ошибкам и поэтому незаконно в большинстве контекстов. Позволяя сохранить значение указателя в" безопасном " типе данных, сантехника между небезопасных сегменты кода могут быть реализовано в более безопасном высокоуровневом коде - или даже на языке .NET, который напрямую не поддерживает указатели.
размер IntPtr зависит от платформы, но эту деталь редко нужно учитывать, так как система автоматически будет использовать правильный размер.
имя "IntPtr" сбивает с толку-что-то вроде
Handleбыло бы более уместно. Моя первоначальная догадка заключалась в том, что" IntPtr " был указателем до целое число. Элемент документация MSDN указателя IntPtr входит в несколько загадочные детали, никогда не давая много понимания о значении имени.альтернативную точку зрения
An
IntPtrуказатель с двумя ограничениями:
- он не может быть непосредственно разыменован
- он не знает тип данных, которые он указывает.
другими словами, an
IntPtrкакvoid*-- но с дополнительной функцией, которая он может (но не должен) использоваться для базовой арифметики указателя.для того, чтобы разыменовать элемент
IntPtr, вы можете либо привести его к истинному указателю (операция, которая может выполняться только в "небезопасных" контекстах), либо передать его вспомогательной подпрограмме, такой как те, которые предоставляютсяInteropServices.Marshalкласса. ИспользуяMarshalкласс дает иллюзию безопасности, так как он не требует, чтобы Вы были в явном "небезопасном" контексте. Однако это не устраняет риск сбоя, который присущ с помощью указателей.
что такое указатель?
во всех языках указатель-это тип переменной, которая хранит адрес памяти, и вы можете либо попросить их сообщить вам адрес они указывают на или значение по адресу они указывают на.
указатель можно рассматривать как своего рода книжный знак. За исключением того, что вместо быстрого перехода на страницу в книге используется указатель для отслеживания или отображения блоков память.
представьте себе память вашей программы точно так же, как один большой массив 65535 байт.
указатели указывают послушно
указатели запоминают один адрес памяти каждый, и поэтому каждый из них указывает на один адрес в памяти.
как группа, указатели запоминают и вспоминают адреса памяти, подчиняясь каждой вашей команде до тошноты.
ты их король.
указатели в C#
в частности, в C# указатель представляет собой целочисленную переменную, которая хранит адрес памяти между 0 и 65534.
также специфично для C#, указатели имеют тип int и поэтому подписаны.
вы не можете использовать отрицательно пронумерованные адреса, хотя и не можете получить доступ к адресу выше 65534. Любая попытка сделать это бросит систему.AccessViolationException.
указатель под названием MyPointer объявляется как Итак:
int *MyPointer;
указатель в C# является int, но адреса памяти в C# начинаются с 0 и простираются до 65534.
заостренные вещи должны быть обработаны с особой осторожностью
слово небезопасных и предназначен для того, чтобы напугать вас, и по очень веской причине: указатели-это заостренные вещи, а заостренные вещи, например, мечи, топоры, указатели и т. д. следует относиться с особенным уход.
указатели дают программисту жесткий контроль над системой. Поэтому ошибки могут иметь более серьезные последствия.
чтобы использовать указатели, небезопасный код должен быть включен в свойствах вашей программы, а указатели должны использоваться исключительно в методах или блоках, помеченных как небезопасные.
пример небезопасного блока
unsafe { // Place code carefully and responsibly here. }как использовать указатели
когда переменные или объекты объявляются или создаются экземпляры, они хранятся в памяти.
- объявите указатель с помощью префикса * symbol.
int *MyPointer;
- для получения адреса переменной используется префикс & symbol.
MyPointer = &MyVariable;после присвоения указателю адреса применяется следующее:
- без префикса * для ссылки на адрес памяти, указанный как int.
MyPointer = &MyVariable; // Set MyPointer to point at MyVariable
- с префиксом*, чтобы получить значение, хранящееся в адресе памяти, на который указывают.
"MyPointer is pointing at " + *MyPointer;поскольку указатель-это переменная, содержащая адрес памяти, этот адрес памяти может быть сохранен в переменной указателя.
пример использования указателей тщательно и ответственно
public unsafe void PointerTest() { int x = 100; // Create a variable named x int *MyPointer = &x; // Store the address of variable named x into the pointer named MyPointer textBox1.Text = ((int)MyPointer).ToString(); // Displays the memory address stored in pointer named MyPointer textBox2.Text = (*MyPointer).ToString(); // Displays the value of the variable named x via the pointer named MyPointer. }обратите внимание, что тип указателя-int. Это потому, что C# интерпретирует адреса памяти как целые числа (int).
почему это int вместо uint?
нет оснований.
зачем использовать указатели?
указатели очень весело. Поскольку большая часть компьютера управляется памятью, указатели позволяют программисту больше контролировать память своей программы.
Контроль памяти.
использовать указатели для чтения блоков памяти и контролируйте, как значения, на которые указывают, изменяются с течением времени.
измените эти значения ответственно и следите за тем, как ваши изменения влияют на ваш компьютер.
MSDN говорит нам:
тип IntPtr конструирован для того чтобы быть целое число, размер которого платформы. То есть ожидается, что экземпляр этого типа быть 32-битным на 32-битном оборудовании и операционных систем и 64-бит на 64-разрядное оборудование и операционные системы.
тип IntPtr можно использовать мимо языки, которые поддерживают указатели, и как общее средство ссылки на данные между языками, которые делают и не делают поддержка указателей.
объекты IntPtr также могут быть использованы для держите ручки. Например, экземпляры указателя IntPtr широко используются в Системы.ИО.Класс FileStream держать дескриптор файла.
тип IntPtr является CLS-совместимым, в то время как тип UIntPtr не является. Только тип IntPtr используется в общем языковая среда выполнения. Тип UIntPtr является в основном для поддержания архитектурная симметрия с IntPtr тип.
http://msdn.microsoft.com/en-us/library/system.intptr (VS. 71). aspx
Ну это страница MSDN что касается
IntPtr.первая строка гласит:
тип платформы, используемый для представления указателя или дескриптора.
Что касается указателя или дескриптора, страница переходит к состоянию:
тип IntPtr может быть использован языки, которые поддерживают указатели, и как общее средство ссылки на данные между языками, которые делают и не делают поддержка указатели.
объекты IntPtr также могут быть использованы для держите ручки. Например, экземпляры указателя IntPtr широко используются в Системы.ИО.Класс FileStream держать дескриптор файла.
указатель-это ссылка на область памяти, которая содержит некоторые данные, которые вас интересуют.
дескриптор может быть идентификатором объекта и передается между методов/классов, когда обе стороны должны получить доступ к этому объекту.
Comments