この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

IntPtr.ToPointer メソッド ()

 

公開日: 2016年10月

このインスタンスの値を指定されていない型のポインターに変換します。

この API は、CLS に準拠していません。

名前空間:   System
アセンブリ:  mscorlib (mscorlib.dll 内)

[CLSCompliantAttribute(false)]
public unsafe void* ToPointer()

戻り値

Type: System.Void*

Void のポインター。つまり指定されていない型のデータが格納されているメモリのポインター。

次の例では、マネージ ポインターを使用して、配列内の文字を反転します。 これが初期化された後、Stringオブジェクトし、その長さを取得は次のこと。

  • 呼び出し、Marshal.StringToHGlobalAnsiに ANSI (1 バイト) 文字として Unicode 文字列をアンマネージ メモリにコピーする方法です。 このメソッドを返します、IntPtrアンマネージ文字列の先頭を指すオブジェクトです。

  • 呼び出し、Marshal.AllocHGlobalアンマネージ文字列が占めるように同じバイト数を割り当てます。 このメソッドを返します、IntPtrアンマネージ メモリ ブロックの先頭を指すオブジェクトです。

  • 呼び出し、ToPointer文字列と、メモリのアンマネージ ブロックの開始アドレスへのアンマネージ ポインターを取得するメソッドを追加および ANSI 文字列の開始アドレスへの文字列の長さよりも小さいです。 アンマネージ文字列のポインターが現在、文字列の末尾を指すため、コピー操作は、文字をメモリ ブロックの先頭に、文字列の末尾からコピーします。

  • ループを使用して、各文字を文字列からメモリのアンマネージ ブロックにコピーします。 各コピー操作の後に、デクリメント アンマネージ ANSI 文字列の次の場所のアドレスへのポインターしアンマネージ ブロック内の次のアドレスへのポインターをインクリメントします。

  • 呼び出し、Marshal.PtrToStringAnsiマネージ Unicode にコピーされた ANSI 文字列を含むアンマネージ メモリ ブロックを変換するStringオブジェクト。

  • 呼び出し元と取り消された文字列を表示した後、Marshal.FreeHGlobalアンマネージ ANSI 文字列とメモリのアンマネージ ブロックに割り当てられたメモリを解放します。

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

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
1.1 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能
トップに戻る
表示: