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)]
[System.Serializable]
public struct IntPtr : System.Runtime.Serialization.ISerializable
type nativeint = struct
    interface ISerializable
Public Structure IntPtr
Implements ISerializable
継承
属性
実装

次の例では、マネージポインターを使用して、配列内の文字を逆にします。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 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) 、メソッドを呼び出して、指定されたオフセット位置にあるバイト (または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 文字列を含むアンマネージStringメモリブロックをマネージ Unicode オブジェクトに変換します。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 に準拠UIntPtrしていますが、型はではありません。 IntPtrThe IntPtr type is CLS-compliant, while the UIntPtr type is not. 共通言語IntPtrランタイムでは、型のみが使用されます。Only the IntPtr type is used in the common language runtime. 型は、ほとんどのIntPtr場合、型を使用してアーキテクチャ対称を維持するために提供されます。 UIntPtrThe 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.

こちらもご覧ください