IntPtr 構造体

定義

ポインターまたはハンドルを表すときに使用されるプラットフォーム固有の型。

public value class IntPtr
public value class IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, IFormattable, System::Runtime::Serialization::ISerializable
public value class IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, ISpanFormattable, 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 : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, ISpanFormattable, 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 ISpanFormattable
    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 IComparable, IComparable(Of IntPtr), IEquatable(Of IntPtr), ISerializable, ISpanFormattable
Public Structure IntPtr
Implements IEquatable(Of IntPtr), ISerializable
Public Structure IntPtr
Implements ISerializable
継承
IntPtr
属性
実装

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

  1. メソッドを呼び出し Marshal.StringToHGlobalAnsi て、Unicode 文字列をアンマネージメモリに ANSI (1 バイト) 文字としてコピーします。 メソッドは、 IntPtr アンマネージ文字列の先頭を指すオブジェクトを返します。 Visual Basic の例では、このポインターを直接使用します。C++ および C# の例では、バイトへのポインターにキャストされます。

  2. メソッドを呼び出し Marshal.AllocHGlobal て、アンマネージ文字列が占有するのと同じバイト数を割り当てます。 メソッドは、 IntPtr アンマネージメモリブロックの先頭を指すオブジェクトを返します。 Visual Basic の例では、このポインターを直接使用します。C++ および C# の例では、バイトへのポインターにキャストされます。

  3. Visual Basic の例では、ANSI 文字列の長さと同じ名前の変数が定義されて offset います。 これは、ANSI 文字列の次の文字がコピーされるアンマネージメモリ内のオフセットを決定するために使用されます。 この開始値は文字列の長さであるため、コピー操作では、文字列の先頭からメモリブロックの末尾までの文字をコピーします。

    C# および C++ の例では、メソッドを呼び出して、 ToPointer 文字列の開始アドレスおよびアンマネージメモリブロックへのアンマネージポインターを取得し、ANSI 文字列の開始アドレスに文字列の長さより1つ少ない値を追加します。 アンマネージ文字列ポインターが文字列の末尾を指すようになったため、コピー操作では、文字列の末尾からメモリブロックの先頭に文字がコピーされます。

  4. ループを使用して、文字列からアンマネージメモリブロックに各文字をコピーします。

    Visual Basic の例では、メソッドを呼び出して、 Marshal.ReadByte(IntPtr, Int32) 指定されたオフセット位置にあるバイト (または1バイト文字) を、マネージポインターから ANSI 文字列に読み取ります。 オフセットは、ループの反復ごとにインクリメントされます。 次に、メソッドを呼び出して、 Marshal.WriteByte(IntPtr, Int32, Byte) メモリ + のアンマネージブロックの開始アドレスによって定義されたメモリアドレスにバイトを書き込み offset ます。 その後、をデクリメント offset します。

    C# および C++ の例では、コピー操作を実行した後、ポインターをアンマネージ ANSI 文字列内の次の位置のアドレスにデクリメントし、ポインターをアンマネージブロックの次のアドレスにインクリメントします。

  5. すべての例では、を呼び出して、コピーした Marshal.PtrToStringAnsi ANSI 文字列を含むアンマネージメモリブロックをマネージ Unicode オブジェクトに変換し String ます。

  6. 元の文字列と逆の文字列を表示した後、すべての例でメソッドを呼び出して、 FreeHGlobal アンマネージ ANSI 文字列およびアンマネージメモリブロックに割り当てられたメモリを解放します。

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 型は、サイズがプラットフォーム固有である整数として設計されています。 つまり、この型のインスタンスは、32ビットのハードウェアとオペレーティングシステムでは32ビット、64のハードウェアとオペレーティングシステムでは64ビットであると想定されています。

型は、 IntPtr ポインターをサポートする言語と、ポインターをサポートしていない言語間でデータを参照する一般的な方法として使用できます。

IntPtr オブジェクトを使用してハンドルを保持することもできます。 たとえば、のインスタンス IntPtr は、 System.IO.FileStream ファイルハンドルを保持するためにクラスで幅広く使用されます。

型は CLS に準拠していますが、 IntPtr UIntPtr 型はではありません。 IntPtr共通言語ランタイムでは、型のみが使用されます。 型は、ほとんどの場合、型を使用して UIntPtr アーキテクチャ対称を維持するために提供され IntPtr ます。

この型は、 ISerializable .net 5.0 以降のインターフェイスで、、およびを実装し IFormattable ます。

コンストラクター

IntPtr(Int32)

指定した 32 ビットのポインターまたはハンドルを使用して、IntPtr の新しいインスタンスを初期化します。

IntPtr(Int64)

指定した 64 ビット ポインターを使用して、IntPtr の新しいインスタンスを初期化します。

IntPtr(Void*)

指定されていない型へのポインターを使用して、IntPtr の新しいインスタンスを初期化します。

フィールド

Zero

0 に初期化されたポインターまたはハンドルを表す読み取り専用フィールド。

プロパティ

MaxValue

IntPtr の最大有効値を表します。

MinValue

IntPtr の最小有効値を表します。

Size

このインスタンスのサイズを取得します。

メソッド

Add(IntPtr, Int32)

ポインターの値にオフセットを加算します。

CompareTo(IntPtr)

現在のインスタンスを同じ型の別のオブジェクトと比較し、現在のインスタンスの並べ替え順序での位置が、比較対象のオブジェクトと比べて前か、後か、または同じかを示す整数を返します。

CompareTo(Object)

現在のインスタンスを同じ型の別のオブジェクトと比較し、現在のインスタンスの並べ替え順序での位置が、比較対象のオブジェクトと比べて前か、後か、または同じかを示す整数を返します。

Equals(IntPtr)

現在のオブジェクトが、同じ型の別のオブジェクトと等しいかどうかを示します。

Equals(Object)

このインスタンスが指定されたオブジェクトに等しいかどうかを示す値を返します。

GetHashCode()

このインスタンスのハッシュ コードを返します。

Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider)

指定したスタイルおよびカルチャ固有の書式による数値の読み取り専用の範囲の文字表現を、それと等価な符号付きネイティブ整数に変換します。

Parse(String)

数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。

Parse(String, IFormatProvider)

指定されたカルチャに固有の書式による数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。

Parse(String, NumberStyles)

指定したスタイルの数値の文字列形式を、それと等しい符号付きネイティブ整数に変換します。

Parse(String, NumberStyles, IFormatProvider)

指定されたスタイルとカルチャに固有の書式による数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。

Subtract(IntPtr, Int32)

ポインターの値からオフセットを減算します。

ToInt32()

このインスタンスの値を 32 ビット符号付き整数に変換します。

ToInt64()

このインスタンスの値を 64 ビット符号付き整数に変換します。

ToPointer()

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

ToString()

現在の IntPtr オブジェクトの数値を等価の文字列形式に変換します。

ToString(IFormatProvider)

このインスタンスの数値を、指定した書式およびカルチャ固有の書式情報を使用して、それと等価な文字列形式に変換します。

ToString(String)

現在の IntPtr オブジェクトの数値を等価の文字列形式に変換します。

ToString(String, IFormatProvider)

指定された書式を使用して現在のインスタンスの値を書式設定します。

TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)

現在のインスタンスの値を、指定した文字の範囲に書式設定しようとします。

TryParse(ReadOnlySpan<Char>, IntPtr)

数値の文字表現の読み取り専用の範囲を、それと等価な符号付きネイティブ整数に変換します。 戻り値は、変換が成功したかどうかを示します。

TryParse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider, IntPtr)

指定したスタイルおよびカルチャ固有の書式による数値の読み取り専用の範囲の文字表現を、それと等価な符号付きネイティブ整数に変換します。 戻り値は、変換が成功したかどうかを示します。

TryParse(String, IntPtr)

数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。 戻り値は、変換が成功したかどうかを示します。

TryParse(String, NumberStyles, IFormatProvider, IntPtr)

指定されたスタイルとカルチャに固有の書式による数値の文字列形式を、それと等価な符号付きネイティブ整数に変換します。 戻り値は、変換が成功したかどうかを示します。

演算子

Addition(IntPtr, Int32)

ポインターの値にオフセットを加算します。

Equality(IntPtr, IntPtr)

IntPtr の 2 つの指定したインスタンスが等しいかどうかを判断します。

Explicit(Int32 to IntPtr)

32 ビット符号付き整数の値を IntPtr に変換します。

Explicit(Int64 to IntPtr)

64 ビット符号付き整数の値を IntPtr に変換します。

Explicit(IntPtr to Int32)

指定した IntPtr の値を 32 ビット符号付き整数に変換します。

Explicit(IntPtr to Int64)

指定した IntPtr の値を 64 ビット符号付き整数に変換します。

Explicit(IntPtr to Void*)

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

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

Explicit(Void* to IntPtr)

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

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

Inequality(IntPtr, IntPtr)

IntPtr の 2 つの指定したインスタンスが等しいかどうかを判断します。

Subtraction(IntPtr, Int32)

ポインターの値からオフセットを減算します。

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

IEquatable<IntPtr>.Equals(IntPtr)

このインスタンスが、別の符号付き整数ポインターと等しいかどうかを示す値を返します。

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo オブジェクトに、現在の IntPtr オブジェクトをシリアル化するために必要なすべてのデータを格納します。

適用対象

スレッド セーフ

この型はスレッド セーフです。

こちらもご覧ください