IntPtr 構造体

定義

ポインターまたはハンドルを表すときに使用されるプラットフォーム固有の型。A platform-specific type that is used to represent a pointer or a handle.

public value class IntPtr
public value class IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, IFormattable, System::Runtime::Serialization::ISerializable
public value class IntPtr : IEquatable<IntPtr>, System::Runtime::Serialization::ISerializable
public value class IntPtr : System::Runtime::Serialization::ISerializable
public struct IntPtr
public struct IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, IFormattable, System.Runtime.Serialization.ISerializable
public struct IntPtr : IEquatable<IntPtr>, System.Runtime.Serialization.ISerializable
[System.Serializable]
public struct IntPtr : System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public struct IntPtr : System.Runtime.Serialization.ISerializable
public struct IntPtr : System.Runtime.Serialization.ISerializable
type nativeint = struct
type nativeint = struct
    interface IFormattable
    interface ISerializable
type nativeint = struct
    interface ISerializable
[<System.Serializable>]
type nativeint = struct
    interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type nativeint = struct
    interface ISerializable
Public Structure IntPtr
Public Structure IntPtr
Implements IComparable, IComparable(Of IntPtr), IEquatable(Of IntPtr), IFormattable, ISerializable
Public Structure IntPtr
Implements IEquatable(Of IntPtr), ISerializable
Public Structure IntPtr
Implements ISerializable
継承
IntPtr
属性
実装

次の例では、マネージポインターを使用して、配列内の文字を逆にします。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 て、Unicode 文字列をアンマネージメモリに ANSI (1 バイト) 文字としてコピーします。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 の例では、ANSI 文字列の長さと同じ名前の変数が定義されて offset います。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 character 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 文字列の開始アドレスおよびアンマネージメモリブロックへのアンマネージポインターを取得し、ANSI 文字列の開始アドレスに文字列の長さより1つ少ない値を追加します。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) 指定されたオフセット位置にあるバイト (または1バイト文字) を、マネージポインターから ANSI 文字列に読み取ります。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 ANSI 文字列を含むアンマネージメモリブロックをマネージ Unicode オブジェクトに変換し 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.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.

型は CLS に準拠していますが、 IntPtr 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 .net 5.0 以降のインターフェイスで、、およびを実装し IFormattable ます。This type implements the ISerializable, and, in .NET 5.0 and later, the IFormattable interfaces.

コンストラクター

IntPtr(Int32)

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

IntPtr(Int64)

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

IntPtr(Void*)

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

フィールド

Zero

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

プロパティ

MaxValue

IntPtr の最大有効値を表します。Represents the largest possible value of IntPtr.

MinValue

IntPtr の最小有効値を表します。Represents the smallest possible value of IntPtr.

Size

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

メソッド

Add(IntPtr, Int32)

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

CompareTo(IntPtr)

現在のインスタンスを同じ型の別のオブジェクトと比較し、現在のインスタンスの並べ替え順序での位置が、比較対象のオブジェクトと比べて前か、後か、または同じかを示す整数を返します。Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.

CompareTo(Object)

現在のインスタンスを同じ型の別のオブジェクトと比較し、現在のインスタンスの並べ替え順序での位置が、比較対象のオブジェクトと比べて前か、後か、または同じかを示す整数を返します。Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.

Equals(IntPtr)

現在のオブジェクトが、同じ型の別のオブジェクトと等しいかどうかを示します。Indicates whether the current object is equal to another object of the same type.

Equals(Object)

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

GetHashCode()

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

Parse(String)

数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。Converts the string representation of a number to its signed native integer equivalent.

Parse(String, IFormatProvider)

指定されたカルチャに固有の書式による数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。Converts the string representation of a number in a specified culture-specific format to its signed native integer equivalent.

Parse(String, NumberStyles)

指定したスタイルの数値の文字列形式を、それと等しい符号付きネイティブ整数に変換します。Converts the string representation of a number in a specified style to its signed native integer equivalent.

Parse(String, NumberStyles, IFormatProvider)

指定されたスタイルとカルチャに固有の書式による数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。Converts the string representation of a number in a specified style and culture-specific format to its signed native integer equivalent.

Subtract(IntPtr, Int32)

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

ToInt32()

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

ToInt64()

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

ToPointer()

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

ToString()

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

ToString(IFormatProvider)

このインスタンスの数値を、指定した書式およびカルチャ固有の書式情報を使用して、それと等価な文字列形式に変換します。Converts the numeric value of this instance to its equivalent string representation using the specified format and culture-specific format information.

ToString(String)

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

ToString(String, IFormatProvider)

指定された書式を使用して現在のインスタンスの値を書式設定します。Formats the value of the current instance using the specified format.

TryParse(String, IntPtr)

数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。Converts the string representation of a number to its signed native integer equivalent. 戻り値は、変換が成功したかどうかを示します。A return value indicates whether the conversion succeeded.

TryParse(String, NumberStyles, IFormatProvider, IntPtr)

指定されたスタイルとカルチャに固有の書式による数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。Converts the string representation of a number in a specified style and culture-specific format to its signed native integer equivalent. 戻り値は、変換が成功したかどうかを示します。A return value indicates whether the conversion succeeded.

演算子

Addition(IntPtr, Int32)

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

Equality(IntPtr, IntPtr)

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

Explicit(Int32 to IntPtr)

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

Explicit(Int64 to IntPtr)

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

Explicit(IntPtr to Int32)

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

Explicit(IntPtr to Int64)

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

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

指定されていない型の指定のポインターを IntPtr に変換します。Converts the specified pointer to an unspecified type to an IntPtr.

この API は、CLS に準拠していません。This API is not CLS-compliant.

Inequality(IntPtr, IntPtr)

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

Subtraction(IntPtr, Int32)

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

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

IEquatable<IntPtr>.Equals(IntPtr)

このインスタンスが、別の符号付き整数ポインターと等しいかどうかを示す値を返します。Returns a value that indicates whether this instance is equal to another signed integer pointer.

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.

こちらもご覧ください