IntPtr.ToPointer IntPtr.ToPointer IntPtr.ToPointer Method

정의

중요

이 API는 CLS 규격이 아닙니다.

이 인스턴스의 값을 알 수 없는 형식의 포인터로 변환합니다.Converts the value of this instance to a pointer to an unspecified type.

public:
 void* ToPointer();
[System.CLSCompliant(false)]
public void* ToPointer ();
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.

  • Loop를 사용 하 여 각 문자 문자열에서 관리 되지 않는 메모리 블록에 복사 합니다.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

적용 대상