IntPtr.ToPointer Метод

Определение

Важно!

Этот API несовместим с CLS.

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

public:
 void* ToPointer();
[System.CLSCompliant(false)]
public void* ToPointer ();
[<System.CLSCompliant(false)>]
member this.ToPointer : unit -> nativeptr<unit>

Возвращаемое значение

Void*

Указатель на Void (указатель на ячейку памяти, содержащую данные незаданного типа).A pointer to Void; that is, a pointer to memory containing data of an unspecified type.

Атрибуты

Примеры

В следующем примере управляемые указатели используются для изменения порядка символов в массиве.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:

  • Вызывает Marshal.StringToHGlobalAnsi метод, чтобы скопировать строку Юникода в неуправляемую память как символы ANSI (однобайтовые).Calls the Marshal.StringToHGlobalAnsi method to copy the Unicode string to unmanaged memory as ANSI (one-byte) characters. Метод возвращает IntPtr объект, указывающий на начало неуправляемой строки.The method returns an IntPtr object that points to the beginning of the unmanaged string.

  • Вызывает 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.

  • Вызывает ToPointer метод, чтобы получить неуправляемый указатель на начальный адрес строки и неуправляемый блок памяти, и добавляет по меньшей мере длину строки в начальный адрес строки ANSI.Calls the ToPointer method to get an unmanaged pointer to the starting address of the string and the unmanaged block of memory, and adds 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.

  • Использует цикл для копирования каждого символа из строки в неуправляемый блок памяти.Uses a loop to copy each character from the string to the unmanaged block of memory. После каждой операции копирования он уменьшает указатель до адреса следующего расположения в неуправляемой строке ANSI и увеличивает указатель до следующего адреса в неуправляемом блоке.After each copy operation, it decrements the pointer to the address of the next location in the unmanaged ANSI string and increments the pointer to the next address in the unmanaged block.

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

  • После отображения исходных и обратных строк вызывает Marshal.FreeHGlobal метод для высвобождения памяти, выделенной для неуправляемой строки ANSI, и неуправляемого блока памяти.After displaying the original and reversed strings, calls the Marshal.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

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