Int Ptr Структура
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяемый платформой тип, который используется для представления указателя или дескриптора.
Примеры
В следующем примере управляемые указатели используются для отмены символов в массиве. После инициализации String объекта и его длины выполняется следующее:
Marshal.StringToHGlobalAnsi Вызывает метод для копирования строки Юникода в неуправляемую память в виде символа ANSI (один байт). Метод возвращает объект, указывающий IntPtr на начало неуправляемой строки. В Visual Basic примере используется этот указатель напрямую; в примерах C++, F# и C# он приводится к указателю на байт.
Marshal.AllocHGlobal Вызывает метод для выделения того же количества байтов, что и неуправляемая строка. Метод возвращает объект, указывающий IntPtr на начало неуправляемого блока памяти. В Visual Basic примере используется этот указатель напрямую; в примерах C++, F# и C# он приводится к указателю на байт.
В Visual Basic примере определяется переменная с именем offset , равная длине строки ANSI. Он используется для определения смещения в неуправляемую память, в которую копируется следующий символ в строке ANSI. Так как начальное значение является длиной строки, операция копирования копирует символ с начала строки до конца блока памяти.
Примеры C#, F# и C++ вызывают ToPointer метод, чтобы получить неуправляемый указатель на начальный адрес строки и неуправляемый блок памяти, и они добавляют одну меньше длины строки в начальный адрес строки ANSI. Так как неуправляемый указатель строки теперь указывает на конец строки, операция копирования копирует символ из конца строки в начало блока памяти.
Использует цикл для копирования каждого символа из строки в неуправляемый блок памяти.
В Visual Basic примере вызывается Marshal.ReadByte(IntPtr, Int32) метод для чтения байта (или однобайтового символа) с указанным смещением от управляемого указателя на строку ANSI. Смещение увеличивается при каждой итерации цикла. Затем он вызывает Marshal.WriteByte(IntPtr, Int32, Byte) метод для записи байта в адрес памяти, определенный начальным адресом неуправляемого блока памяти плюс offset . Затем он уменьшается offset .
В примерах C#, F# и C++ выполняется операция копирования, а затем уменьшается указатель на адрес следующего расположения в неуправляемой строке ANSI и увеличивает указатель на следующий адрес в неуправляемом блоке.
Все примеры вызывают Marshal.PtrToStringAnsi преобразование неуправляемого блока памяти, содержащего скопированную строку ANSI, в управляемый объект Юникода String .
После отображения исходных и обратных строк все примеры вызывают FreeHGlobal метод, чтобы освободить память, выделенную для неуправляемой строки ANSI и неуправляемого блока памяти.
Комментарии
Тип IntPtr предназначен для целого числа, размер которого зависит от платформы. То есть экземпляр этого типа должен быть 32-разрядным на 32-разрядном оборудовании и операционных системах, а 64-разрядные — на 64-разрядном оборудовании и операционных системах.
Этот IntPtr тип может использоваться языками, поддерживающими указатели, а также общим средством ссылки на данные между языками, которые делают и не поддерживают указатели.
IntPtr объекты также можно использовать для хранения дескрипторов. Например, экземпляры IntPtr используются в классе для System.IO.FileStream хранения дескрипторов файлов.
Тип IntPtr является CLS-совместимым, в то время как UIntPtr тип не является. IntPtr В среде CLR используется только тип. Тип UIntPtr предоставляется в основном для поддержания симметрии архитектуры с типом IntPtr .
Этот тип реализует ISerializableинтерфейсы в .NET 5 и более поздних версияхIFormattable.
В C# начиная с версии 9.0 можно использовать встроенный nint тип для определения целых чисел собственного размера. Этот тип представлен внутренним типом IntPtr и предоставляет операции и преобразования, подходящие для целых типов. Дополнительные сведения см. в разделе nint и nuint types.
Конструкторы
Инициализирует новый экземпляр структуры IntPtr с помощью заданного 32-битового указателя или дескриптора.
Инициализирует новый экземпляр IntPtr с использованием заданного 64-разрядного указателя.
Инициализирует новый экземпляр структуры IntPtr с использованием заданного указателя на незаданный тип.
Доступное только для чтения поле, которое предоставляет указатель или дескриптор, инициализированный с нулевым значением.
Свойства
Возвращает наибольшее возможное значение IntPtr.
Возвращает наименьшее возможное значение IntPtr.
Получает размер этого экземпляра.
Методы
Добавляет смещение к значению указателя.
Сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект.
Сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект.
Указывает, равен ли текущий объект другому объекту того же типа.
Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту.
Возвращает хэш-код данного экземпляра.
Преобразует диапазон символов, доступных только для чтения, представление числа в указанном стиле и формате языка и региональных параметров в эквивалентное ей целое число со знаком.
Преобразует строковое представление числа в эквивалентное ему собственное целое число со знаком.
Преобразует строковое представление числа в формате, зависящем от языка и региональных параметров, в эквивалентное ему собственное целое число со знаком.
Преобразует строковое представление числа в указанном стиле в эквивалентное ему собственное целое число со знаком.
Преобразует строковое представление числа в указанном стиле и формате, зависящем от языка и региональных параметров, в эквивалентное ему собственное целое число со знаком.
Вычитает смещение из значения указателя.
Преобразует значение этого экземпляра в формат 32-разрядного целого числа со знаком.
Преобразует значение этого экземпляра в формат 64-разрядного целого числа со знаком.
Преобразует значение этого экземпляра в указатель незаданного типа.
Преобразует числовое значение текущего объекта IntPtr в эквивалентное ему строковое представление.
Преобразует числовое значение данного экземпляра в эквивалентное ему строковое представление с использованием указанного формата и сведений об особенностях форматирования для данного языка и региональных параметров.
Преобразует числовое значение текущего объекта IntPtr в эквивалентное ему строковое представление.
Форматирует значение текущего экземпляра, используя указанный формат.
Пытается отформатировать значение текущего экземпляра в предоставленный диапазон символов.
Преобразует диапазон символов, доступный только для чтения, представление числа в эквивалентное ей целое число со знаком. Возвращает значение, указывающее, успешно ли выполнено преобразование.
Преобразует диапазон символов, доступных только для чтения, представление числа в указанном стиле и формате языка и региональных параметров в эквивалентное ей целое число со знаком. Возвращает значение, указывающее, успешно ли выполнено преобразование.
Преобразует строковое представление числа в эквивалентное ему собственное целое число со знаком. Возвращает значение, указывающее, успешно ли выполнено преобразование.
Преобразует строковое представление числа в указанном стиле и формате, зависящем от языка и региональных параметров, в эквивалентное ему собственное целое число со знаком. Возвращает значение, указывающее, успешно ли выполнено преобразование.
Операторы
Добавляет смещение к значению указателя.
Определяет, равны ли два заданных экземпляра класса IntPtr.
Преобразует 32-разрядное целочисленное значение со знаком в IntPtr.
Преобразует 64-разрядное целочисленное значение со знаком в IntPtr.
Преобразует значение заданной структуры IntPtr в формат 32-разрядного целого числа со знаком.
Преобразует значение заданной структуры IntPtr в формат 64-разрядного целого числа со знаком.
Преобразует значение заданной структуры IntPtr в указатель на незаданный тип.
Этот интерфейс API CLS-несовместим.
Преобразует заданный указатель на незаданный тип в IntPtr.
Этот интерфейс API CLS-несовместим.
Определяет, являются ли два заданных экземпляра класса IntPtr неравными.
Вычитает смещение из значения указателя.
Явные реализации интерфейса
Возвращает число байтов, которые будут записаны в составе TryWriteLittleEndian(Span<Byte>, Int32).
Возвращает длину (в битах) от кратчайшего дополнительного представления текущего значения.
Пытается записать текущее значение в минимальном формате в заданный диапазон.
Возвращает значение, указывающее, равен ли этот экземпляр другому целочисленному указателю со знаком.
Заполняет объект SerializationInfo данными, необходимыми для сериализации текущего объекта IntPtr.
Что такое IntPtr?
Используя IntelliSense и просматривая чужой код, я наткнулся на этот тип IntPtr ; каждый раз, когда его нужно было использовать, я просто вставлял null или IntPtr.Zero и обнаруживал, что большинство функций работают. Что это такое и когда / почему используется?
8 ответов
Это «родное (зависящее от платформы) целое число». Он внутренне представлен как void* , но представлен как целое число. Вы можете использовать его всякий раз, когда вам нужно сохранить неуправляемый указатель и вы не хотите использовать код unsafe . IntPtr.Zero фактически означает NULL (нулевой указатель).
Это тип значения, достаточно большой для хранения адреса памяти, который используется в машинном или небезопасном коде, но не может напрямую использоваться в качестве адреса памяти в безопасном управляемом коде.
Вы можете использовать IntPtr.Size , чтобы узнать, работаете ли вы в 32-битном или 64-битном процессе, так как это будет 4 или 8 байтов соответственно.
Я пишу программу на C #, которая взаимодействует с высокоскоростной камерой. У камеры есть собственный драйвер, который получает изображения и автоматически загружает их в память компьютера.
Поэтому, когда я готов добавить последнее изображение в свою программу для работы, драйвер камеры предоставляет мне IntPtr, где изображение УЖЕ хранится в физической памяти, поэтому мне не нужно тратить время / ресурсы на создание другого блок памяти для хранения изображения, которое уже находится в памяти. IntPtr просто показывает мне, где уже находится изображение.
Прямая интерпретация
IntPtr — это целое число , которое имеет тот же размер, что и указатель .
Вы можете использовать IntPtr для хранения значения указателя в типе без указателя. Эта функция важна в .NET, поскольку использование указателей очень подвержено ошибкам и, следовательно, незаконно в большинстве контекстов. Если разрешить сохранение значения указателя в «безопасном» типе данных, переход между небезопасными сегментами кода может быть реализован в более безопасном высокоуровневом коде — или даже на языке .NET, который не напрямую поддерживают указатели.
Размер IntPtr зависит от платформы, но эту деталь редко нужно учитывать, поскольку система автоматически использует правильный размер.
Название «IntPtr» сбивает с толку — что-то вроде Handle могло бы быть более подходящим. Мое первоначальное предположение заключалось в том, что «IntPtr» был указателем на целое число. В документации MSDN для IntPtr содержится несколько загадочная деталь, которая никогда не дает подробного понимания значения имени.
Альтернативная перспектива
IntPtr — это указатель с двумя ограничениями:
- Это не может быть разыменовано напрямую
- Ему неизвестен тип данных, на которые он указывает.
Другими словами, IntPtr похож на void* — но с дополнительной функцией, которую можно (но не следует) использовать для базовой арифметики указателей.
Чтобы разыменовать IntPtr , вы можете либо преобразовать его в истинный указатель (операция, которая может выполняться только в «небезопасных» контекстах), либо вы можете передать его вспомогательной подпрограмме, такой как предоставляемая InteropServices.Marshal класс. Использование класса Marshal создает иллюзию безопасности, поскольку не требует, чтобы вы находились в явном «небезопасном» контексте. Однако это не устраняет риск сбоя, присущий использованию указателей.
Что такое указатель?
Во всех языках указатель — это тип переменной, в которой хранится адрес памяти, и вы можете попросить их сообщить вам адрес , на который они указывают, или значение по адресу они указывают на.
Указатель можно рассматривать как своего рода закладку. За исключением того, что вместо того, чтобы использоваться для быстрого перехода к странице в книге, указатель используется для отслеживания или отображения блоков памяти.
Представьте себе память вашей программы как один большой массив из 65535 байт.
Указатели послушно указывают
Указатели запоминают каждый адрес памяти, и поэтому каждый указывает на один адрес в памяти.
Как группа, указатели запоминают и вызывают адреса памяти, подчиняясь каждой вашей команде до тошноты.
Указатели в C #
В частности, в C # указатель — это целочисленная переменная, в которой хранится адрес памяти от 0 до 65534.
Также специфичны для C #, указатели имеют тип int и, следовательно, подписаны.
Однако вы не можете использовать адреса с отрицательной нумерацией, как и вы не можете получить доступ к адресу выше 65534. Любая попытка сделать это вызовет исключение System.AccessViolationException.
Указатель под названием MyPointer объявляется так:
Указатель в C # — это int, но адреса памяти в C # начинаются с 0 и простираются до 65534.
С острыми предметами следует обращаться с особой осторожностью
Слово небезопасно предназначено для того, чтобы напугать вас, и по очень уважительной причине: указатели — это острые предметы, например с мечами, топорами, указками и т. д. следует обращаться с особой осторожностью.
Указатели дают программисту жесткий контроль над системой. Поэтому допущенные ошибки могут иметь более серьезные последствия.
Чтобы использовать указатели, небезопасный код должен быть включен в свойствах вашей программы, а указатели должны использоваться исключительно в методах или блоках, отмеченных как небезопасные.
Пример небезопасной блокировки
Как использовать указатели
Когда переменные или объекты объявляются или создаются, они сохраняются в памяти.
- Объявите указатель с помощью префикса символа *.
- Чтобы получить адрес переменной, вы используете префикс символа &.
После того, как адрес назначен указателю, применяется следующее:
- Без префикса * для обозначения адреса памяти, указываемого как int.
MyPointer = &MyVariable; // Set MyPointer to point at MyVariable
- С префиксом *, чтобы получить значение, хранящееся по указанному адресу памяти.
«MyPointer is pointing at » + *MyPointer;
Поскольку указатель — это переменная, которая содержит адрес памяти, этот адрес памяти может быть сохранен в переменной указателя.
Пример осторожного и ответственного использования указателей
Обратите внимание, что тип указателя — int. Это связано с тем, что C # интерпретирует адреса памяти как целые числа (int).
Почему это int вместо uint?
Нет веской причины.
Зачем нужны указатели?
Указатели — это очень весело. Поскольку большая часть компьютера контролируется памятью, указатели дают программисту больше возможностей контролировать память своей программы.
Мониторинг памяти .
Используйте указатели для чтения блоков памяти и отслеживания изменения значений, на которые они указывают, с течением времени.
Изменяйте эти значения ответственно и отслеживайте, как ваши изменения повлияют на ваш компьютер.
MSDN сообщает нам:
Тип IntPtr разработан как целое число, размер которого зависит от платформы. То есть ожидается, что экземпляр этого типа будет 32-битным на 32-битном оборудовании и операционных системах и 64-битным на 64-битном оборудовании и операционных системах.
Тип IntPtr может использоваться языками, поддерживающими указатели, и как обычное средство обращения к данным между языками, которые поддерживают и не поддерживают указатели.
Объекты IntPtr также могут использоваться для удержания дескрипторов. Например, экземпляры IntPtr широко используются в классе System.IO.FileStream для хранения дескрипторов файлов.
Тип IntPtr является CLS-совместимым, а тип UIntPtr — нет. В среде CLR используется только тип IntPtr. Тип UIntPtr предоставляется в основном для поддержания архитектурной симметрии с типом IntPtr.
Это страница MSDN, которая касается с IntPtr .
Первая строка гласит:
Зависящий от платформы тип, который используется для представления указателя или дескриптора.
Что касается указателя или дескриптора, страница продолжает указывать:
Тип IntPtr может использоваться языками, поддерживающими указатели, и как обычное средство обращения к данным между языками, которые поддерживают и не поддерживают указатели.
Объекты IntPtr также могут использоваться для удержания дескрипторов. Например, экземпляры IntPtr широко используются в классе System.IO.FileStream для хранения дескрипторов файлов.
Указатель — это ссылка на область памяти, в которой хранятся интересующие вас данные.
Дескриптор может быть идентификатором объекта и передается между методами / классами, когда обе стороны нуждаются в доступе к этому объекту.
IntPtr — это тип значения , который в основном используется для хранения адресов памяти или дескрипторов. указатель это адрес памяти. Указатель может быть типизированным (например, int* ) или нетипизированным (например, void* ). Дескриптор Windows — это значение, которое обычно имеет тот же размер (или меньше), чем адрес памяти и представляет собой системный ресурс (например, файл или окно).
Что такое IntPtr?
используя IntelliSense и глядя на код других людей, я столкнулся с этим IntPtr тип; каждый раз, когда его нужно было использовать, я просто поставил null или IntPtr.Zero и нашел большинство функций для работы. Что это такое и когда / почему оно используется?
7 ответов
это » собственное (специфичное для платформы) целое число размера.»Это внутренне представлено как void* но представляется как целое число. Вы можете использовать его, когда вам нужно сохранить неуправляемый указатель и не хотите использовать unsafe код. IntPtr.Zero эффективно NULL (нулевой указатель).
Это тип значения, достаточно большой для хранения адреса памяти, используемого в собственном или небезопасном коде, но не используемый напрямую в качестве адреса памяти в безопасном управляемом коде.
можно использовать IntPtr.Size чтобы узнать, работаете ли вы в 32-битном или 64-битном процессе, так как это будет 4 или 8 байт соответственно.
Я пишу программу на C#, которая взаимодействует с высокоскоростной камеры. Камера имеет свой собственный драйвер, который получает изображения и загружает их в память компьютера автоматически.
поэтому, когда я готов принести последнее изображение в мою программу для работы, драйвер камеры предоставляет мне IntPtr, где изображение уже хранится в физической памяти, поэтому мне не нужно тратить время / ресурсы на создание другого блока памяти для храните образ, который уже есть в памяти. IntPtr просто показывает мне, где изображение уже есть.
прямой перевод
An IntPtr это целое который имеет тот же размер, что и указатель.
вы можете использовать IntPtr для хранения значения указателя в типе без указателя. Эта функция важна в .NET, так как использование указателей очень подвержено ошибкам и поэтому незаконно в большинстве контекстов. Позволяя значение указателя храниться в» безопасном » типе данных, сантехника между небезопасных сегменты кода могут быть реализован в более безопасном коде высокого уровня — или даже на языке .NET, который напрямую не поддерживает указатели.
размер IntPtr зависит от платформы, но эту деталь редко нужно учитывать, так как система автоматически будет использовать правильный размер.
название «IntPtr» сбивает с толку — что-то вроде Handle было бы более уместно. Мое первоначальное предположение состояло в том, что» IntPtr » был указателем to целое число. The документация MSDN указателя IntPtr переходит в несколько загадочные детали, никогда не давая много понимания о значении имени.
альтернативную точку зрения
An IntPtr указатель с двумя ограничениями:
- он не может быть напрямую разыменован
- он не знает тип данных, которые он указывает.
другими словами, an IntPtr как void* — но с дополнительной функцией, которая он может (но не должен) использоваться для базовой арифметики указателя.
для того, чтобы разыменовать элемент IntPtr , вы можете либо привести его к истинному указателю (операция, которая может быть выполнена только в «небезопасных» контекстах), либо передать его вспомогательной процедуре, такой как те, которые предоставляются InteropServices.Marshal класса. С помощью Marshal класс дает иллюзию безопасности, поскольку он не требует, чтобы Вы были в явном «небезопасном» контексте. Тем не менее, это не устраняет риск сбоя, который присущ использование указателей.
что такое указатель?
на всех языках, указатель-это тип переменной, которая хранит адрес в памяти, и вы можете либо попросите их сказать вам адрес они указывают на или значение по адресу они указывают на.
указатель можно рассматривать как своего рода книжный знак. За исключением того, что вместо быстрого перехода на страницу в книге указатель используется для отслеживания или отображения блоков память.
представьте память вашей программы точно как один большой массив 65535 байт.
указатели указывают послушно
указатели запоминают по одному адресу памяти, и поэтому каждый из них указывает на один адрес в памяти.
как группа, указатели запоминают и запоминают адреса памяти, подчиняясь каждой вашей команде до тошноты.
указатели в В C#
в частности, в C# указатель представляет собой целочисленную переменную, которая хранит адрес памяти между 0 и 65534.
также специфично для C#, указатели имеют тип int и, следовательно, подписаны.
вы не можете использовать отрицательно пронумерованные адреса, хотя и не можете получить доступ к адресу выше 65534. Любая попытка сделать это приведет к сбою системы.Как AccessViolationException.
указатель под названием MyPointer объявляется как Итак:
указатель в C# является int, но адреса памяти в C# начинаются с 0 и простираются до 65534.
заостренные вещи должны обрабатываться с особой осторожностью
слово небезопасных is предназначен для того, чтобы напугать вас, и по очень веской причине: указатели-это острые вещи, и острые вещи, например, мечи, топоры, указатели и т. д. следует относиться с особенным уход.
указатели дают программисту жесткий контроль над системой. Поэтому ошибки могут иметь более серьезные последствия.
чтобы использовать указатели, небезопасный код должен быть включен в свойствах вашей программы, а указатели должны использоваться исключительно в методах или блоках, помеченных как небезопасные.
пример небезопасного блока
как использовать указатели
когда переменные или объекты объявляются или создаются экземпляры, они хранятся в памяти.
- объявите указатель с помощью префикса * symbol.
- для получения адреса переменной используется префикс & symbol.
как только адрес назначен указателю, применяется следующее:
- без префикса * для ссылки на адрес памяти, на который указывается как int.
MyPointer = &MyVariable; // Set MyPointer to point at MyVariable
- с префиксом*, чтобы получить значение, хранящееся на указанном адресе памяти.
«MyPointer is pointing at » + *MyPointer;
поскольку указатель-это переменная, содержащая адрес памяти, этот адрес памяти может храниться в переменной указателя.
пример использования указателей тщательно и ответственно
обратите внимание, что тип указателя-int. Это потому, что C# интерпретирует адреса памяти как целые числа (int).
почему это int вместо uint?
зачем использовать указатели?
указатели очень весело. Поскольку большая часть компьютера контролируется памятью, указатели дают программисту больше возможностей контролировать память своей программы.
Контроль памяти.
использовать указатели для чтения блоков памяти и контролируйте, как значения, на которые указывают, меняются с течением времени.
измените эти значения ответственно и следите за тем, как ваши изменения влияют на ваш компьютер.
MSDN сообщает нам:
тип IntPtr конструирован для того чтобы быть целое число, размер которого платформы. То есть ожидается, что экземпляр этого типа быть 32-бит на 32-битном оборудовании и операционные системы и 64-разрядные 64-разрядное оборудование и операционные системы.
тип IntPtr может использоваться языки, поддерживающие указатели, и в качестве общего средства ссылки на данные между языками, которые делают и не делают поддержка указателей.
объекты IntPtr также могут использоваться для держите ручки. Например, экземпляры IntPtr использованы обширно в Система.ИО.Класс FileStream для хранения дескриптор файла.
тип IntPtr CLS-совместимый, в то время как тип UIntPtr не является. Только тип IntPtr используется в общем среда CLR. Тип UIntPtr является в основном для поддержания архитектурная симметрия с IntPtr тип.
Ну это страница MSDN что касается IntPtr .
первая строка гласит:
специфичный для платформы тип, используемый для представления указателя или дескриптора.
как указатель или дескриптор страницы гласит:
тип IntPtr может использоваться языки, поддерживающие указатели, и в качестве общего средства ссылки на данные между языками, которые делают и не делают поддержка указатели.
объекты IntPtr также могут использоваться для держите ручки. Например, экземпляры IntPtr использованы обширно в Система.ИО.Класс FileStream для хранения дескриптор файла.
указатель-это ссылка на область памяти, которая содержит некоторые данные, которые вас интересуют.
дескриптор может быть идентификатором объекта и передается между методов/классов, когда обе стороны должны получить доступ к этому объекту.