IntPtr IntPtr IntPtr IntPtr Struct

定義

ポインターまたはハンドルを表すときに使用されるプラットフォーム固有の型。 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)]
[Serializable]
public struct IntPtr : System.Runtime.Serialization.ISerializable
type nativeint = struct
    interface ISerializable
Public Structure IntPtr
Implements ISerializable
継承
属性
ComVisibleAttribute SerializableAttribute
実装

次の例では、マネージ ポインターを使用して、配列内の文字を反転します。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 (1 バイト) 文字としてアンマネージ メモリに Unicode 文字列をコピーする方法。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文字列とメモリのアンマネージ ブロックの開始アドレスへのアンマネージ ポインターを取得するメソッドを 1 つを追加して 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 文字列にマネージ ポインターから、指定したオフセット バイト (または 1 バイト文字) を読み取ります。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マネージ Unicode にコピーされた 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
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.

IntPtr型は CLS に準拠して中に、UIntPtrの種類します。The IntPtr type is CLS-compliant, while the UIntPtr type is not. のみ、IntPtr型は、共通言語ランタイムで使用します。Only the IntPtr type is used in the common language runtime. UIntPtrアーキテクチャ対称性を維持するためにほとんどの種類を指定、IntPtr型。The UIntPtr type is provided mostly to maintain architectural symmetry with the IntPtr type.

この型は、ISerializableインターフェイス。This type implements the ISerializable interface.

コンストラクター

IntPtr(Int32) IntPtr(Int32) IntPtr(Int32) IntPtr(Int32)

指定した 32 ビットのポインターまたはハンドルを使用して、IntPtr の新しいインスタンスを初期化します。 Initializes a new instance of IntPtr using the specified 32-bit pointer or handle.

IntPtr(Int64) IntPtr(Int64) IntPtr(Int64) IntPtr(Int64)

指定した 64 ビット ポインターを使用して、IntPtr の新しいインスタンスを初期化します。 Initializes a new instance of IntPtr using the specified 64-bit pointer.

IntPtr(Void*) IntPtr(Void*) IntPtr(Void*) IntPtr(Void*)

指定されていない型へのポインターを使用して、IntPtr の新しいインスタンスを初期化します。 Initializes a new instance of IntPtr using the specified pointer to an unspecified type.

フィールド

Zero Zero Zero Zero

0 に初期化されたポインターまたはハンドルを表す読み取り専用フィールド。 A read-only field that represents a pointer or handle that has been initialized to zero.

プロパティ

Size Size Size Size

このインスタンスのサイズを取得します。 Gets the size of this instance.

方法

Add(IntPtr, Int32) Add(IntPtr, Int32) Add(IntPtr, Int32) Add(IntPtr, Int32)

ポインターの値にオフセットを加算します。 Adds an offset to the value of a pointer.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

このインスタンスが指定されたオブジェクトに等しいかどうかを示す値を返します。 Returns a value indicating whether this instance is equal to a specified object.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

このインスタンスのハッシュ コードを返します。 Returns the hash code for this instance.

Subtract(IntPtr, Int32) Subtract(IntPtr, Int32) Subtract(IntPtr, Int32) Subtract(IntPtr, Int32)

ポインターの値からオフセットを減算します。 Subtracts an offset from the value of a pointer.

ToInt32() ToInt32() ToInt32() ToInt32()

このインスタンスの値を 32 ビット符号付き整数に変換します。 Converts the value of this instance to a 32-bit signed integer.

ToInt64() ToInt64() ToInt64() ToInt64()

このインスタンスの値を 64 ビット符号付き整数に変換します。 Converts the value of this instance to a 64-bit signed integer.

ToPointer() ToPointer() ToPointer() ToPointer()

このインスタンスの値を指定されていない型のポインターに変換します。 Converts the value of this instance to a pointer to an unspecified type.

ToString(String) ToString(String) ToString(String) ToString(String)

現在の IntPtr オブジェクトの数値を等価の文字列形式に変換します。 Converts the numeric value of the current IntPtr object to its equivalent string representation.

ToString() ToString() ToString() ToString()

現在の IntPtr オブジェクトの数値を等価の文字列形式に変換します。 Converts the numeric value of the current IntPtr object to its equivalent string representation.

演算子

Addition(IntPtr, Int32) Addition(IntPtr, Int32) Addition(IntPtr, Int32) Addition(IntPtr, Int32)

ポインターの値にオフセットを加算します。 Adds an offset to the value of a pointer.

Equality(IntPtr, IntPtr) Equality(IntPtr, IntPtr) Equality(IntPtr, IntPtr) Equality(IntPtr, IntPtr)

IntPtr の 2 つの指定したインスタンスが等しいかどうかを判断します。 Determines whether two specified instances of IntPtr are equal.

Explicit(Void* to IntPtr) Explicit(Void* to IntPtr) Explicit(Void* to IntPtr) Explicit(Void* to IntPtr)

指定されていない型の指定のポインターを IntPtr に変換します。 Converts the specified pointer to an unspecified type to an IntPtr. この API は、CLS に準拠していません。 This API is not CLS-compliant.

Explicit(IntPtr to Int64) Explicit(IntPtr to Int64) Explicit(IntPtr to Int64) Explicit(IntPtr to Int64)

指定した IntPtr の値を 64 ビット符号付き整数に変換します。 Converts the value of the specified IntPtr to a 64-bit signed integer.

Explicit(IntPtr to Void*) Explicit(IntPtr to Void*) Explicit(IntPtr to Void*) 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(Int64 to IntPtr) Explicit(Int64 to IntPtr) Explicit(Int64 to IntPtr) Explicit(Int64 to IntPtr)

64 ビット符号付き整数の値を IntPtr に変換します。 Converts the value of a 64-bit signed integer to an IntPtr.

Explicit(Int32 to IntPtr) Explicit(Int32 to IntPtr) Explicit(Int32 to IntPtr) Explicit(Int32 to IntPtr)

32 ビット符号付き整数の値を IntPtr に変換します。 Converts the value of a 32-bit signed integer to an IntPtr.

Explicit(IntPtr to Int32) Explicit(IntPtr to Int32) Explicit(IntPtr to Int32) Explicit(IntPtr to Int32)

指定した IntPtr の値を 32 ビット符号付き整数に変換します。 Converts the value of the specified IntPtr to a 32-bit signed integer.

Inequality(IntPtr, IntPtr) Inequality(IntPtr, IntPtr) Inequality(IntPtr, IntPtr) Inequality(IntPtr, IntPtr)

IntPtr の 2 つの指定したインスタンスが等しいかどうかを判断します。 Determines whether two specified instances of IntPtr are not equal.

Subtraction(IntPtr, Int32) Subtraction(IntPtr, Int32) Subtraction(IntPtr, Int32) Subtraction(IntPtr, Int32)

ポインターの値からオフセットを減算します。 Subtracts an offset from the value of a pointer.

明示的なインターフェイスの実装

IEquatable<IntPtr>.Equals(IntPtr) IEquatable<IntPtr>.Equals(IntPtr) IEquatable<IntPtr>.Equals(IntPtr) IEquatable<IntPtr>.Equals(IntPtr)
ISerializable.GetObjectData(SerializationInfo, StreamingContext) ISerializable.GetObjectData(SerializationInfo, StreamingContext) ISerializable.GetObjectData(SerializationInfo, StreamingContext) 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.

こちらもご覧ください