IntPtr Структура

Определение

Определяемый платформой тип, который используется для представления указателя или дескриптора.A platform-specific type that is used to represent a pointer or a handle.

public value class IntPtr : System::Runtime::Serialization::ISerializable
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public struct IntPtr : System.Runtime.Serialization.ISerializable
type nativeint = struct
    interface ISerializable
Public Structure IntPtr
Implements ISerializable
Наследование
IntPtr
Атрибуты
Реализации

Примеры

В следующем примере управляемые указатели используются для изменения порядка символов в массиве.The following example uses managed pointers to reverse the characters in an array. После того как инициализирует String объект и получает его длину, он выполняет следующие действия:After it initializes a String object and gets its length, it does the following:

  1. Marshal.StringToHGlobalAnsi Вызывает метод, чтобы скопировать строку Юникода в неуправляемую память как символ ANSI (однобайтовый).Calls the Marshal.StringToHGlobalAnsi method to copy the Unicode string to unmanaged memory as an ANSI (one-byte) character. Метод возвращает IntPtr объект, указывающий на начало неуправляемой строки.The method returns an IntPtr object that points to the beginning of the unmanaged string. В Visual Basic примере этот указатель используется напрямую; в C++ примерах C# и он приводится к указателю на байт.The Visual Basic example uses this pointer directly; in the C++ and C# examples, it is cast to a pointer to a byte.

  2. Marshal.AllocHGlobal Вызывает метод для выделения того же числа байтов, занимаемого неуправляемой строкой.Calls the Marshal.AllocHGlobal method to allocate the same number of bytes as the unmanaged string occupies. Метод возвращает IntPtr объект, указывающий на начало неуправляемого блока памяти.The method returns an IntPtr object that points to the beginning of the unmanaged block of memory. В Visual Basic примере этот указатель используется напрямую; в C++ примерах C# и он приводится к указателю на байт.The Visual Basic example uses this pointer directly; in the C++ and C# examples, it is cast to a pointer to a byte.

  3. В Visual Basic примере определяется переменная с именем offset , равная длине строки ANSI.The Visual Basic example defines a variable named offset that is equal to the length of the ANSI string. Он используется для определения смещения в неуправляемой памяти, в которую копируется Следующая уставная строка в строке ANSI.It is used to determine the offset into unmanaged memory to which the next charter in the ANSI string is copied. Поскольку его начальное значение равно длине строки, операция копирования скопирует символ из начала строки в конец блока памяти.Because its starting value is the length of the string, the copy operation will copy a character from the start of the string to the end of the memory block.

    Примеры C# C++ вызывают методдляполучениянеуправляемогоуказателянаначальныйадресстрокиинеуправляемогоблокапамятиидобавляютоднуменьшедлиныстрокикначальномуадресуToPointer строки ANSI.The C# and C++ examples call the ToPointer method to get an unmanaged pointer to the starting address of the string and the unmanaged block of memory, and they add one less than the length of the string to the starting address of the ANSI string. Так как указатель неуправляемой строки теперь указывает на конец строки, операция копирования скопирует символ из конца строки в начало блока памяти.Because the unmanaged string pointer now points to the end of the string, the copy operation will copy a character from the end of the string to the start of the memory block.

  4. Использует цикл для копирования каждого символа из строки в неуправляемый блок памяти.Uses a loop to copy each character from the string to the unmanaged block of memory.

    В Visual Basic примере вызывается Marshal.ReadByte(IntPtr, Int32) метод для считывания байта (или однобайтового символа) с указанным смещением от управляемого указателя к строке ANSI.The Visual Basic example calls the Marshal.ReadByte(IntPtr, Int32) method to read the byte (or one-byte character) at a specified offset from the managed pointer to the ANSI string. Смещение увеличивается при каждой итерации цикла.The offset is incremented with each iteration of the loop. Затем он вызывает Marshal.WriteByte(IntPtr, Int32, Byte) метод для записи байта в адрес памяти, определенный начальным адресом неуправляемого блока памяти плюс offset.It then calls the Marshal.WriteByte(IntPtr, Int32, Byte) method to write the byte to the memory address defined by the starting address of the unmanaged block of memory plus offset. Затем он уменьшается offset.It then decrements offset.

    Примеры C# и C++ выполняют операцию копирования, а затем уменьшают указатель до адреса следующего расположения в неуправляемой строке ANSI и увеличивают указатель до следующего адреса в неуправляемом блоке.The C# and C++ examples perform the copy operation, then decrement the pointer to the address of the next location in the unmanaged ANSI string and increment the pointer to the next address in the unmanaged block.

  5. Все примеры вызывают метод Marshal.PtrToStringAnsi для преобразования блока неуправляемой памяти, содержащего скопированную строку ANSI, в управляемый String объект Юникода.All examples call the Marshal.PtrToStringAnsi to convert the unmanaged memory block containing the copied ANSI string to a managed Unicode String object.

  6. После отображения исходных и обратных строк все примеры вызывают FreeHGlobal метод для высвобождения памяти, выделенной для неуправляемой строки ANSI, и неуправляемого блока памяти.After displaying the original and reversed strings, all examples call the FreeHGlobal method to free the memory allocated for the unmanaged ANSI string and the unmanaged block of memory.

using namespace System;
using namespace System::Runtime::InteropServices;

class NotTooSafeStringReverse
{
public:
    static void Main()
    {
        String^ stringA = "I seem to be turned around!";
        int copylen = stringA->Length;

        // Allocate HGlobal memory for source and destination strings
        IntPtr sptr = Marshal::StringToHGlobalAnsi(stringA);
        IntPtr dptr = Marshal::AllocHGlobal(copylen + 1);

        char *src = (char *)sptr.ToPointer();
        char *dst = (char *)dptr.ToPointer();

        if (copylen > 0)
        {
            // set the source pointer to the end of the string
            // to do a reverse copy.
            src += copylen - 1;

            while (copylen-- > 0)
            {
                *dst++ = *src--;
            }
            *dst = 0;
        }
        String^ stringB = Marshal::PtrToStringAnsi(dptr);

        Console::WriteLine("Original:\n{0}\n", stringA);
        Console::WriteLine("Reversed:\n{0}", stringB);

        // Free HGlobal memory
        Marshal::FreeHGlobal(dptr);
        Marshal::FreeHGlobal(sptr);
    }
};

int main()
{
    NotTooSafeStringReverse::Main();
}

// The progam has the following output:
//
// Original:
// I seem to be turned around!
//
// Reversed:
// !dnuora denrut eb ot mees I
using System;
using System.Runtime.InteropServices;

class NotTooSafeStringReverse
{
    static public void Main()
    {
        string stringA = "I seem to be turned around!";
        int copylen = stringA.Length;

        // Allocate HGlobal memory for source and destination strings
        IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
        IntPtr dptr = Marshal.AllocHGlobal(copylen + 1);

        // The unsafe section where byte pointers are used.
        unsafe
        {
            byte *src = (byte *)sptr.ToPointer();
            byte *dst = (byte *)dptr.ToPointer();

            if (copylen > 0)
            {
                // set the source pointer to the end of the string
                // to do a reverse copy.
                src += copylen - 1;

                while (copylen-- > 0)
                {
                    *dst++ = *src--;
                }
                *dst = 0;
            }
        }
        string stringB = Marshal.PtrToStringAnsi(dptr);

        Console.WriteLine("Original:\n{0}\n", stringA);
        Console.WriteLine("Reversed:\n{0}", stringB);

        // Free HGlobal memory
        Marshal.FreeHGlobal(dptr);
        Marshal.FreeHGlobal(sptr);
    }
}

// The progam has the following output:
//
// Original:
// I seem to be turned around!
//
// Reversed:
// !dnuora denrut eb ot mees I
Imports System.Runtime.InteropServices

Public Module Example
    Public Sub Main()
        Dim stringA As String = "I seem to be turned around!"
        Dim copylen As Integer = stringA.Length

        ' Allocate HGlobal memory for source and destination strings
        Dim sptr As IntPtr = Marshal.StringToHGlobalAnsi(stringA)
        Dim dptr As IntPtr = Marshal.AllocHGlobal(copylen)
        Dim offset As Integer = copylen - 1

         For ctr As Integer = 0 To copylen - 1
            Dim b As Byte = Marshal.ReadByte(sptr, ctr)
            Marshal.WriteByte(dptr, offset, b)
            offset -= 1
         Next

        Dim stringB As String = Marshal.PtrToStringAnsi(dptr)

        Console.WriteLine("Original:{1}{0}{1}", stringA, vbCrLf)
        Console.WriteLine("Reversed:{1}{0}{1}", stringB, vbCrLf)

        ' Free HGlobal memory
        Marshal.FreeHGlobal(dptr)
        Marshal.FreeHGlobal(sptr)
    End Sub
End Module
' The example displays the following output:
'       Original:
'       I seem to be turned around!
'
'       Reversed:
'       !dnuora denrut eb ot mees I

Комментарии

IntPtr Тип разрабатывается как целое число, размер которого зависит от платформы.The IntPtr type is designed to be an integer whose size is platform-specific. То есть экземпляр этого типа должен иметь 32 бит на 32-разрядном оборудовании и операционных системах, а 64-бит на 64-разрядном оборудовании и операционных системах.That is, an instance of this type is expected to be 32-bits on 32-bit hardware and operating systems, and 64-bits on 64-bit hardware and operating systems.

IntPtr Тип может использоваться языками, поддерживающими указатели, и как распространенный способ обращения к данным между языками, которые не поддерживают указатели.The IntPtr type can be used by languages that support pointers, and as a common means of referring to data between languages that do and do not support pointers.

IntPtrобъекты также можно использовать для хранения дескрипторов.IntPtr objects can also be used to hold handles. Например, экземпляры IntPtr широко используются System.IO.FileStream в классе для хранения дескрипторов файлов.For example, instances of IntPtr are used extensively in the System.IO.FileStream class to hold file handles.

Тип является CLS-совместимым, UIntPtr а тип — нет. IntPtrThe IntPtr type is CLS-compliant, while the UIntPtr type is not. В среде CLR используется только тип.IntPtrOnly the IntPtr type is used in the common language runtime. Тип предоставляется преимущественно для поддержки архитектурной симметрии IntPtr с типом. UIntPtrThe UIntPtr type is provided mostly to maintain architectural symmetry with the IntPtr type.

Этот тип реализует интерфейс ISerializable.This type implements the ISerializable interface.

Конструкторы

IntPtr(Int32)

Инициализирует новый экземпляр структуры IntPtr с помощью заданного 32-битового указателя или дескриптора.Initializes a new instance of IntPtr using the specified 32-bit pointer or handle.

IntPtr(Int64)

Инициализирует новый экземпляр IntPtr с использованием заданного 64-разрядного указателя.Initializes a new instance of IntPtr using the specified 64-bit pointer.

IntPtr(Void*)

Инициализирует новый экземпляр структуры IntPtr с использованием заданного указателя на незаданный тип.Initializes a new instance of IntPtr using the specified pointer to an unspecified type.

Поля

Zero

Доступное только для чтения поле, которое предоставляет указатель или дескриптор, инициализированный с нулевым значением.A read-only field that represents a pointer or handle that has been initialized to zero.

Свойства

Size

Получает размер этого экземпляра.Gets the size of this instance.

Методы

Add(IntPtr, Int32)

Добавляет смещение к значению указателя.Adds an offset to the value of a pointer.

Equals(Object)

Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту.Returns a value indicating whether this instance is equal to a specified object.

GetHashCode()

Возвращает хэш-код данного экземпляра.Returns the hash code for this instance.

Subtract(IntPtr, Int32)

Вычитает смещение из значения указателя.Subtracts an offset from the value of a pointer.

ToInt32()

Преобразует значение этого экземпляра в формат 32-разрядного целого числа со знаком.Converts the value of this instance to a 32-bit signed integer.

ToInt64()

Преобразует значение этого экземпляра в формат 64-разрядного целого числа со знаком.Converts the value of this instance to a 64-bit signed integer.

ToPointer()

Преобразует значение этого экземпляра в указатель незаданного типа.Converts the value of this instance to a pointer to an unspecified type.

ToString()

Преобразует числовое значение текущего объекта IntPtr в эквивалентное ему строковое представление.Converts the numeric value of the current IntPtr object to its equivalent string representation.

ToString(String)

Преобразует числовое значение текущего объекта IntPtr в эквивалентное ему строковое представление.Converts the numeric value of the current IntPtr object to its equivalent string representation.

Операторы

Addition(IntPtr, Int32)

Добавляет смещение к значению указателя.Adds an offset to the value of a pointer.

Equality(IntPtr, IntPtr)

Определяет, равны ли два заданных экземпляра класса IntPtr.Determines whether two specified instances of IntPtr are equal.

Explicit(Int32 to IntPtr)

Преобразует 32-разрядное целочисленное значение со знаком в IntPtr.Converts the value of a 32-bit signed integer to an IntPtr.

Explicit(Int64 to IntPtr)

Преобразует 64-разрядное целочисленное значение со знаком в IntPtr.Converts the value of a 64-bit signed integer to an IntPtr.

Explicit(IntPtr to Int32)

Преобразует значение заданной структуры IntPtr в формат 32-разрядного целого числа со знаком.Converts the value of the specified IntPtr to a 32-bit signed integer.

Explicit(IntPtr to Int64)

Преобразует значение заданной структуры IntPtr в формат 64-разрядного целого числа со знаком.Converts the value of the specified IntPtr to a 64-bit signed integer.

Explicit(IntPtr to Void*)

Преобразует значение заданной структуры IntPtr в указатель на незаданный тип.Converts the value of the specified IntPtr to a pointer to an unspecified type.

Этот интерфейс API CLS-несовместим.This API is not CLS-compliant.

Explicit(Void* to IntPtr)

Преобразует заданный указатель на незаданный тип в IntPtr.Converts the specified pointer to an unspecified type to an IntPtr.

Этот интерфейс API CLS-несовместим.This API is not CLS-compliant.

Inequality(IntPtr, IntPtr)

Определяет, являются ли два заданных экземпляра класса IntPtr неравными.Determines whether two specified instances of IntPtr are not equal.

Subtraction(IntPtr, Int32)

Вычитает смещение из значения указателя.Subtracts an offset from the value of a pointer.

Явные реализации интерфейса

IEquatable<IntPtr>.Equals(IntPtr)
ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Заполняет объект SerializationInfo данными, необходимыми для сериализации текущего объекта IntPtr.Populates a SerializationInfo object with the data needed to serialize the current IntPtr object.

Применяется к

Потокобезопасность

Данный тип потокобезопасен.This type is thread safe.

Дополнительно