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 (1 バイト) 文字としてアンマネージ メモリに Unicode 文字列をコピーする方法。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マネージ Unicode にコピーされた 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

適用対象