다음을 통해 공유


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 : IComparable<IntPtr>, IEquatable<IntPtr>, IParsable<IntPtr>, ISpanParsable<IntPtr>, System::Numerics::IAdditionOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IAdditiveIdentity<IntPtr, IntPtr>, System::Numerics::IBinaryInteger<IntPtr>, System::Numerics::IBinaryNumber<IntPtr>, System::Numerics::IBitwiseOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IComparisonOperators<IntPtr, IntPtr, bool>, System::Numerics::IDecrementOperators<IntPtr>, System::Numerics::IDivisionOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IEqualityOperators<IntPtr, IntPtr, bool>, System::Numerics::IIncrementOperators<IntPtr>, System::Numerics::IMinMaxValue<IntPtr>, System::Numerics::IModulusOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IMultiplicativeIdentity<IntPtr, IntPtr>, System::Numerics::IMultiplyOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::INumber<IntPtr>, System::Numerics::INumberBase<IntPtr>, System::Numerics::IShiftOperators<IntPtr, int, IntPtr>, System::Numerics::ISignedNumber<IntPtr>, System::Numerics::ISubtractionOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IUnaryNegationOperators<IntPtr, IntPtr>, System::Numerics::IUnaryPlusOperators<IntPtr, IntPtr>, System::Runtime::Serialization::ISerializable
public value class IntPtr : IComparable<IntPtr>, IEquatable<IntPtr>, IParsable<IntPtr>, ISpanParsable<IntPtr>, IUtf8SpanParsable<IntPtr>, System::Numerics::IAdditionOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IAdditiveIdentity<IntPtr, IntPtr>, System::Numerics::IBinaryInteger<IntPtr>, System::Numerics::IBinaryNumber<IntPtr>, System::Numerics::IBitwiseOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IComparisonOperators<IntPtr, IntPtr, bool>, System::Numerics::IDecrementOperators<IntPtr>, System::Numerics::IDivisionOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IEqualityOperators<IntPtr, IntPtr, bool>, System::Numerics::IIncrementOperators<IntPtr>, System::Numerics::IMinMaxValue<IntPtr>, System::Numerics::IModulusOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IMultiplicativeIdentity<IntPtr, IntPtr>, System::Numerics::IMultiplyOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::INumber<IntPtr>, System::Numerics::INumberBase<IntPtr>, System::Numerics::IShiftOperators<IntPtr, int, IntPtr>, System::Numerics::ISignedNumber<IntPtr>, System::Numerics::ISubtractionOperators<IntPtr, IntPtr, IntPtr>, System::Numerics::IUnaryNegationOperators<IntPtr, IntPtr>, System::Numerics::IUnaryPlusOperators<IntPtr, IntPtr>, 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 readonly struct IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, IFormattable, System.Runtime.Serialization.ISerializable
public readonly struct IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, ISpanFormattable, System.Runtime.Serialization.ISerializable
public readonly struct IntPtr : IComparable<IntPtr>, IEquatable<IntPtr>, IParsable<IntPtr>, ISpanParsable<IntPtr>, System.Numerics.IAdditionOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IAdditiveIdentity<IntPtr,IntPtr>, System.Numerics.IBinaryInteger<IntPtr>, System.Numerics.IBinaryNumber<IntPtr>, System.Numerics.IBitwiseOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IComparisonOperators<IntPtr,IntPtr,bool>, System.Numerics.IDecrementOperators<IntPtr>, System.Numerics.IDivisionOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IEqualityOperators<IntPtr,IntPtr,bool>, System.Numerics.IIncrementOperators<IntPtr>, System.Numerics.IMinMaxValue<IntPtr>, System.Numerics.IModulusOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IMultiplicativeIdentity<IntPtr,IntPtr>, System.Numerics.IMultiplyOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.INumber<IntPtr>, System.Numerics.INumberBase<IntPtr>, System.Numerics.IShiftOperators<IntPtr,int,IntPtr>, System.Numerics.ISignedNumber<IntPtr>, System.Numerics.ISubtractionOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IUnaryNegationOperators<IntPtr,IntPtr>, System.Numerics.IUnaryPlusOperators<IntPtr,IntPtr>, System.Runtime.Serialization.ISerializable
public readonly struct IntPtr : IComparable<IntPtr>, IEquatable<IntPtr>, IParsable<IntPtr>, ISpanParsable<IntPtr>, IUtf8SpanParsable<IntPtr>, System.Numerics.IAdditionOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IAdditiveIdentity<IntPtr,IntPtr>, System.Numerics.IBinaryInteger<IntPtr>, System.Numerics.IBinaryNumber<IntPtr>, System.Numerics.IBitwiseOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IComparisonOperators<IntPtr,IntPtr,bool>, System.Numerics.IDecrementOperators<IntPtr>, System.Numerics.IDivisionOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IEqualityOperators<IntPtr,IntPtr,bool>, System.Numerics.IIncrementOperators<IntPtr>, System.Numerics.IMinMaxValue<IntPtr>, System.Numerics.IModulusOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IMultiplicativeIdentity<IntPtr,IntPtr>, System.Numerics.IMultiplyOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.INumber<IntPtr>, System.Numerics.INumberBase<IntPtr>, System.Numerics.IShiftOperators<IntPtr,int,IntPtr>, System.Numerics.ISignedNumber<IntPtr>, System.Numerics.ISubtractionOperators<IntPtr,IntPtr,IntPtr>, System.Numerics.IUnaryNegationOperators<IntPtr,IntPtr>, System.Numerics.IUnaryPlusOperators<IntPtr,IntPtr>, System.Runtime.Serialization.ISerializable
public struct IntPtr : IEquatable<IntPtr>, System.Runtime.Serialization.ISerializable
public readonly 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 IFormattable
    interface IParsable<nativeint>
    interface ISpanFormattable
    interface ISpanParsable<nativeint>
    interface IAdditionOperators<nativeint, nativeint, nativeint>
    interface IAdditiveIdentity<nativeint, nativeint>
    interface IBinaryInteger<nativeint>
    interface IBinaryNumber<nativeint>
    interface IBitwiseOperators<nativeint, nativeint, nativeint>
    interface IComparisonOperators<nativeint, nativeint, bool>
    interface IEqualityOperators<nativeint, nativeint, bool>
    interface IDecrementOperators<nativeint>
    interface IDivisionOperators<nativeint, nativeint, nativeint>
    interface IIncrementOperators<nativeint>
    interface IModulusOperators<nativeint, nativeint, nativeint>
    interface IMultiplicativeIdentity<nativeint, nativeint>
    interface IMultiplyOperators<nativeint, nativeint, nativeint>
    interface INumber<nativeint>
    interface INumberBase<nativeint>
    interface ISubtractionOperators<nativeint, nativeint, nativeint>
    interface IUnaryNegationOperators<nativeint, nativeint>
    interface IUnaryPlusOperators<nativeint, nativeint>
    interface IShiftOperators<nativeint, int, nativeint>
    interface IMinMaxValue<nativeint>
    interface ISignedNumber<nativeint>
    interface ISerializable
type nativeint = struct
    interface IFormattable
    interface IParsable<nativeint>
    interface ISpanFormattable
    interface ISpanParsable<nativeint>
    interface IAdditionOperators<nativeint, nativeint, nativeint>
    interface IAdditiveIdentity<nativeint, nativeint>
    interface IBinaryInteger<nativeint>
    interface IBinaryNumber<nativeint>
    interface IBitwiseOperators<nativeint, nativeint, nativeint>
    interface IComparisonOperators<nativeint, nativeint, bool>
    interface IEqualityOperators<nativeint, nativeint, bool>
    interface IDecrementOperators<nativeint>
    interface IDivisionOperators<nativeint, nativeint, nativeint>
    interface IIncrementOperators<nativeint>
    interface IModulusOperators<nativeint, nativeint, nativeint>
    interface IMultiplicativeIdentity<nativeint, nativeint>
    interface IMultiplyOperators<nativeint, nativeint, nativeint>
    interface INumber<nativeint>
    interface INumberBase<nativeint>
    interface ISubtractionOperators<nativeint, nativeint, nativeint>
    interface IUnaryNegationOperators<nativeint, nativeint>
    interface IUnaryPlusOperators<nativeint, nativeint>
    interface IUtf8SpanFormattable
    interface IUtf8SpanParsable<nativeint>
    interface IShiftOperators<nativeint, int, nativeint>
    interface IMinMaxValue<nativeint>
    interface ISignedNumber<nativeint>
    interface ISerializable
type nativeint = struct
    interface IFormattable
    interface IParsable<nativeint>
    interface ISpanFormattable
    interface ISpanParsable<nativeint>
    interface IUtf8SpanFormattable
    interface IUtf8SpanParsable<nativeint>
    interface IAdditionOperators<nativeint, nativeint, nativeint>
    interface IAdditiveIdentity<nativeint, nativeint>
    interface IBinaryInteger<nativeint>
    interface IBinaryNumber<nativeint>
    interface IBitwiseOperators<nativeint, nativeint, nativeint>
    interface IComparisonOperators<nativeint, nativeint, bool>
    interface IEqualityOperators<nativeint, nativeint, bool>
    interface IDecrementOperators<nativeint>
    interface IDivisionOperators<nativeint, nativeint, nativeint>
    interface IIncrementOperators<nativeint>
    interface IModulusOperators<nativeint, nativeint, nativeint>
    interface IMultiplicativeIdentity<nativeint, nativeint>
    interface IMultiplyOperators<nativeint, nativeint, nativeint>
    interface INumber<nativeint>
    interface INumberBase<nativeint>
    interface ISubtractionOperators<nativeint, nativeint, nativeint>
    interface IUnaryNegationOperators<nativeint, nativeint>
    interface IUnaryPlusOperators<nativeint, nativeint>
    interface IShiftOperators<nativeint, int, nativeint>
    interface IMinMaxValue<nativeint>
    interface ISignedNumber<nativeint>
    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 IAdditionOperators(Of IntPtr, IntPtr, IntPtr), IAdditiveIdentity(Of IntPtr, IntPtr), IBinaryInteger(Of IntPtr), IBinaryNumber(Of IntPtr), IBitwiseOperators(Of IntPtr, IntPtr, IntPtr), IComparable(Of IntPtr), IComparisonOperators(Of IntPtr, IntPtr, Boolean), IDecrementOperators(Of IntPtr), IDivisionOperators(Of IntPtr, IntPtr, IntPtr), IEqualityOperators(Of IntPtr, IntPtr, Boolean), IEquatable(Of IntPtr), IIncrementOperators(Of IntPtr), IMinMaxValue(Of IntPtr), IModulusOperators(Of IntPtr, IntPtr, IntPtr), IMultiplicativeIdentity(Of IntPtr, IntPtr), IMultiplyOperators(Of IntPtr, IntPtr, IntPtr), INumber(Of IntPtr), INumberBase(Of IntPtr), IParsable(Of IntPtr), ISerializable, IShiftOperators(Of IntPtr, Integer, IntPtr), ISignedNumber(Of IntPtr), ISpanParsable(Of IntPtr), ISubtractionOperators(Of IntPtr, IntPtr, IntPtr), IUnaryNegationOperators(Of IntPtr, IntPtr), IUnaryPlusOperators(Of IntPtr, IntPtr)
Public Structure IntPtr
Implements IAdditionOperators(Of IntPtr, IntPtr, IntPtr), IAdditiveIdentity(Of IntPtr, IntPtr), IBinaryInteger(Of IntPtr), IBinaryNumber(Of IntPtr), IBitwiseOperators(Of IntPtr, IntPtr, IntPtr), IComparable(Of IntPtr), IComparisonOperators(Of IntPtr, IntPtr, Boolean), IDecrementOperators(Of IntPtr), IDivisionOperators(Of IntPtr, IntPtr, IntPtr), IEqualityOperators(Of IntPtr, IntPtr, Boolean), IEquatable(Of IntPtr), IIncrementOperators(Of IntPtr), IMinMaxValue(Of IntPtr), IModulusOperators(Of IntPtr, IntPtr, IntPtr), IMultiplicativeIdentity(Of IntPtr, IntPtr), IMultiplyOperators(Of IntPtr, IntPtr, IntPtr), INumber(Of IntPtr), INumberBase(Of IntPtr), IParsable(Of IntPtr), ISerializable, IShiftOperators(Of IntPtr, Integer, IntPtr), ISignedNumber(Of IntPtr), ISpanParsable(Of IntPtr), ISubtractionOperators(Of IntPtr, IntPtr, IntPtr), IUnaryNegationOperators(Of IntPtr, IntPtr), IUnaryPlusOperators(Of IntPtr, IntPtr), IUtf8SpanParsable(Of IntPtr)
Public Structure IntPtr
Implements IEquatable(Of IntPtr), ISerializable
Public Structure IntPtr
Implements ISerializable
상속
IntPtr
특성
구현
IComparable IComparable<IntPtr> IEquatable<IntPtr> IFormattable ISerializable ISpanFormattable IComparable<TSelf> IEquatable<TSelf> IParsable<IntPtr> IParsable<TSelf> ISpanParsable<IntPtr> ISpanParsable<TSelf> IAdditionOperators<IntPtr,IntPtr,IntPtr> IAdditionOperators<TSelf,TSelf,TSelf> IAdditiveIdentity<IntPtr,IntPtr> IAdditiveIdentity<TSelf,TSelf> IBinaryInteger<IntPtr> IBinaryNumber<IntPtr> IBinaryNumber<TSelf> IBitwiseOperators<IntPtr,IntPtr,IntPtr> IBitwiseOperators<TSelf,TSelf,TSelf> IComparisonOperators<IntPtr,IntPtr,Boolean> IComparisonOperators<TSelf,TSelf,Boolean> IDecrementOperators<IntPtr> IDecrementOperators<TSelf> IDivisionOperators<IntPtr,IntPtr,IntPtr> IDivisionOperators<TSelf,TSelf,TSelf> IEqualityOperators<IntPtr,IntPtr,Boolean> IEqualityOperators<TSelf,TOther,TResult> IEqualityOperators<TSelf,TSelf,Boolean> IIncrementOperators<IntPtr> IIncrementOperators<TSelf> IMinMaxValue<IntPtr> IModulusOperators<IntPtr,IntPtr,IntPtr> IModulusOperators<TSelf,TSelf,TSelf> IMultiplicativeIdentity<IntPtr,IntPtr> IMultiplicativeIdentity<TSelf,TSelf> IMultiplyOperators<IntPtr,IntPtr,IntPtr> IMultiplyOperators<TSelf,TSelf,TSelf> INumber<IntPtr> INumber<TSelf> INumberBase<IntPtr> INumberBase<TSelf> IShiftOperators<IntPtr,Int32,IntPtr> IShiftOperators<TSelf,Int32,TSelf> ISignedNumber<IntPtr> ISubtractionOperators<IntPtr,IntPtr,IntPtr> ISubtractionOperators<TSelf,TSelf,TSelf> IUnaryNegationOperators<IntPtr,IntPtr> IUnaryNegationOperators<TSelf,TSelf> IUnaryPlusOperators<IntPtr,IntPtr> IUnaryPlusOperators<TSelf,TSelf> IUtf8SpanFormattable IUtf8SpanParsable<IntPtr> IUtf8SpanParsable<TSelf>

예제

다음 예제에서는 관리되는 포인터를 사용하여 배열의 문자를 역방향으로 설정합니다. String 개체를 초기화하고 길이를 가져오면 다음을 수행합니다.

  1. Marshal.StringToHGlobalAnsi 메서드를 호출하여 유니코드 문자열을 관리되지 않는 메모리에 ANSI(1 바이트) 문자로 복사합니다. 메서드는 관리되지 않는 문자열의 시작을 가리키는 IntPtr 개체를 반환합니다. Visual Basic 예제에서는 이 포인터를 직접 사용합니다. C++, F# 및 C# 예제에서는 바이트에 대한 포인터로 캐스팅됩니다.

  2. Marshal.AllocHGlobal 메서드를 호출하여 관리되지 않는 문자열이 차지하는 것과 동일한 바이트 수를 할당합니다. 메서드는 관리되지 않는 메모리 블록의 시작을 가리키는 IntPtr 개체를 반환합니다. Visual Basic 예제에서는 이 포인터를 직접 사용합니다. C++, F# 및 C# 예제에서는 바이트에 대한 포인터로 캐스팅됩니다.

  3. Visual Basic 예제에서는 ANSI 문자열의 길이와 같은 offset 변수를 정의합니다. ANSI 문자열의 다음 문자가 복사되는 관리되지 않는 메모리로의 오프셋을 결정하는 데 사용됩니다. 시작 값은 문자열의 길이이므로 복사 작업은 문자열의 시작에서 메모리 블록의 끝으로 문자를 복사합니다.

    C#, F# 및 C++ 예제에서는 ToPointer 메서드를 호출하여 문자열의 시작 주소와 관리되지 않는 메모리 블록에 대한 관리되지 않는 포인터를 가져와서 ANSI 문자열의 시작 주소에 문자열 길이보다 작은 포인터를 추가합니다. 관리되지 않는 문자열 포인터가 이제 문자열의 끝을 가리키기 때문에 복사 작업은 문자열의 끝에서 메모리 블록의 시작 부분까지 문자를 복사합니다.

  4. 루프를 사용하여 문자열의 각 문자를 관리되지 않는 메모리 블록으로 복사합니다.

    Visual Basic 예제에서는 Marshal.ReadByte(IntPtr, Int32) 메서드를 호출하여 관리되는 포인터에서 ANSI 문자열에 대한 지정된 오프셋에서 바이트(또는 1 바이트 문자)를 읽습니다. 오프셋은 루프의 각 반복에 따라 증가합니다. 그런 다음 Marshal.WriteByte(IntPtr, Int32, Byte) 메서드를 호출하여 관리되지 않는 메모리 블록의 시작 주소와 offset정의한 메모리 주소에 바이트를 씁니다. 그런 다음 offset감소합니다.

    C#, F# 및 C++ 예제에서는 복사 작업을 수행한 다음 관리되지 않는 ANSI 문자열에서 다음 위치의 주소에 대한 포인터를 감소시키고 관리되지 않는 블록의 다음 주소로 포인터를 증분합니다.

  5. 모든 예제에서는 Marshal.PtrToStringAnsi 호출하여 복사한 ANSI 문자열을 포함하는 관리되지 않는 메모리 블록을 관리되는 유니코드 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
#nowarn "9"
open System.Runtime.InteropServices
open FSharp.NativeInterop

[<EntryPoint>]
let main _ = 
    let stringA = "I seem to be turned around!"
    let mutable copylen = stringA.Length

    // Allocate HGlobal memory for source and destination strings
    let sptr = Marshal.StringToHGlobalAnsi stringA
    let dptr = Marshal.AllocHGlobal(copylen + 1)

    let mutable src: byte nativeptr = sptr.ToPointer() |> NativePtr.ofVoidPtr
    let mutable dst: byte nativeptr = dptr.ToPointer() |> NativePtr.ofVoidPtr

    if copylen > 0 then
        // set the source pointer to the end of the string
        // to do a reverse copy.
        src <- 
            NativePtr.toNativeInt src + nativeint (copylen - 1) 
            |> NativePtr.ofNativeInt

        while copylen > 0 do
            copylen <- copylen - 1
            NativePtr.read src |> NativePtr.write dst
            dst <- NativePtr.toNativeInt dst + 1n |> NativePtr.ofNativeInt
            src <- NativePtr.toNativeInt src - 1n |> NativePtr.ofNativeInt
        NativePtr.write dst 0uy

    let stringB = Marshal.PtrToStringAnsi dptr

    printfn $"Original:\n{stringA}\n"
    printfn $"Reversed:\n{stringB}"

    // Free HGlobal memory
    Marshal.FreeHGlobal dptr
    Marshal.FreeHGlobal sptr
    0

// 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 클래스에서 광범위하게 사용됩니다.

메모

포인터 또는 핸들로 IntPtr 사용하는 것은 오류가 발생하기 쉽고 안전하지 않습니다. 단순히 같은 크기로 인해 포인터 및 핸들의 교환 형식으로 사용할 수 있는 정수 형식입니다. 포인터를 지원하지 않는 언어로 데이터를 전달하는 것과 같은 특정 교환 요구 사항 외에 포인터를 나타내는 데 올바르게 형식화된 포인터를 사용해야 하며 SafeHandle 핸들을 나타내는 데 사용해야 합니다.

이 형식은 ISerializable구현합니다. .NET 5 이상 버전에서 이 형식은 IFormattable 인터페이스도 구현합니다. .NET 7 이상 버전에서 이 형식은 IBinaryInteger<TSelf>, IMinMaxValue<TSelf>ISignedNumber<TSelf> 인터페이스도 구현합니다.

버전 9.0부터 C#에서 기본 제공 nint 형식을 사용하여 네이티브 크기의 정수를 정의할 수 있습니다. 이 형식은 내부적으로 IntPtr 형식으로 표시되며 정수 형식에 적합한 작업 및 변환을 제공합니다. 자세한 내용은 nint 및 nuint 형식참조하세요.

C#에서 버전 11부터 .NET 7 이상 런타임을 대상으로 하는 경우 nintintInt32별칭인 것과 동일한 방식으로 IntPtr 별칭입니다.

생성자

IntPtr(Int32)

지정된 32비트 부가 정수로 IntPtr 새 인스턴스를 초기화합니다.

IntPtr(Int64)

지정된 64비트 부가 정수로 IntPtr 새 인스턴스를 초기화합니다.

IntPtr(Void*)

지정되지 않은 형식에 대한 지정된 포인터를 사용하여 IntPtr 새 인스턴스를 초기화합니다.

필드

Zero

0으로 초기화된 부가 정수의 읽기 전용 필드입니다.

속성

MaxValue

가능한 가장 큰 IntPtr값을 가져옵니다.

MinValue

IntPtr가능한 가장 작은 값을 가져옵니다.

Size

이 인스턴스의 크기를 가져옵니다.

메서드

Abs(IntPtr)

값의 절대값을 계산합니다.

Add(IntPtr, Int32)

부인 정수에 오프셋을 추가합니다.

Clamp(IntPtr, IntPtr, IntPtr)

값을 포괄 최소값 및 최대값으로 고정합니다.

CompareTo(IntPtr)

현재 인스턴스를 동일한 형식의 다른 개체와 비교하고 현재 인스턴스가 다른 개체와 정렬 순서의 동일한 위치에서 선행, 팔로우 또는 발생하는지 여부를 나타내는 정수를 반환합니다.

CompareTo(Object)

현재 인스턴스를 동일한 형식의 다른 개체와 비교하고 현재 인스턴스가 다른 개체와 정렬 순서의 동일한 위치에서 선행, 팔로우 또는 발생하는지 여부를 나타내는 정수를 반환합니다.

CopySign(IntPtr, IntPtr)

값의 기호를 다른 값의 기호에 복사합니다.

CreateChecked<TOther>(TOther)

현재 형식의 표현 가능한 범위를 벗어나는 값에 대해 오버플로 예외를 throw하여 값에서 현재 형식의 인스턴스를 만듭니다.

CreateSaturating<TOther>(TOther)

현재 형식의 표현 가능한 범위를 벗어나는 모든 값을 채도하여 값에서 현재 형식의 인스턴스를 만듭니다.

CreateTruncating<TOther>(TOther)

현재 형식의 표현 가능한 범위를 벗어나는 값을 잘라내어 값에서 현재 형식의 인스턴스를 만듭니다.

DivRem(IntPtr, IntPtr)

두 값의 몫과 나머지를 계산합니다.

Equals(IntPtr)

현재 개체가 같은 형식의 다른 개체와 같은지 여부를 나타냅니다.

Equals(Object)

이 인스턴스가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.

GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.

IsEvenInteger(IntPtr)

값이 짝수 정수인지 여부를 확인합니다.

IsNegative(IntPtr)

값이 음수인지 여부를 확인합니다.

IsOddInteger(IntPtr)

값이 홀수 정수인지 여부를 결정합니다.

IsPositive(IntPtr)

값이 양수인지 여부를 확인합니다.

IsPow2(IntPtr)

값이 2의 힘인지 확인합니다.

LeadingZeroCount(IntPtr)

값의 선행 0 수를 계산합니다.

Log2(IntPtr)

값의 log2를 계산합니다.

Max(IntPtr, IntPtr)

두 값을 더 큰 컴퓨팅과 비교합니다.

MaxMagnitude(IntPtr, IntPtr)

두 값을 더 큰 컴퓨팅과 비교합니다.

Min(IntPtr, IntPtr)

두 값을 더 작은 컴퓨팅과 비교합니다.

MinMagnitude(IntPtr, IntPtr)

두 값을 더 작은 컴퓨팅과 비교합니다.

Parse(ReadOnlySpan<Byte>, IFormatProvider)

UTF-8 문자의 범위를 값으로 구문 분석합니다.

Parse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider)

UTF-8 문자의 범위를 값으로 구문 분석합니다.

Parse(ReadOnlySpan<Char>, IFormatProvider)

문자 범위를 값으로 구문 분석합니다.

Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider)

지정된 스타일 및 문화권별 형식으로 된 숫자의 읽기 전용 문자 표현 범위를 해당하는 부호 있는 네이티브 정수로 변환합니다.

Parse(String)

숫자의 문자열 표현을 해당하는 부호 있는 네이티브 정수로 변환합니다.

Parse(String, IFormatProvider)

지정된 문화권별 형식의 숫자 문자열 표현을 해당하는 부호 있는 네이티브 정수로 변환합니다.

Parse(String, NumberStyles)

지정된 스타일의 숫자 문자열 표현을 해당하는 부호 있는 네이티브 정수로 변환합니다.

Parse(String, NumberStyles, IFormatProvider)

지정된 스타일 및 문화권별 형식의 숫자 문자열 표현을 해당하는 부호 있는 네이티브 정수로 변환합니다.

PopCount(IntPtr)

값에 설정된 비트 수를 계산합니다.

RotateLeft(IntPtr, Int32)

지정된 양만큼 남은 값을 회전합니다.

RotateRight(IntPtr, Int32)

값을 지정된 양만큼 오른쪽으로 회전합니다.

Sign(IntPtr)

값의 부호를 계산합니다.

Subtract(IntPtr, Int32)

부속 정수에서 오프셋을 뺍니다.

ToInt32()

이 인스턴스의 값을 32비트 부속 정수로 변환합니다.

ToInt64()

이 인스턴스의 값을 64비트 부속 정수로 변환합니다.

ToPointer()

이 인스턴스의 값을 지정되지 않은 형식으로 포인터로 변환합니다.

ToString()

현재 IntPtr 개체의 숫자 값을 해당하는 문자열 표현으로 변환합니다.

ToString(IFormatProvider)

지정된 형식 및 문화권별 형식 정보를 사용하여 이 인스턴스의 숫자 값을 해당하는 문자열 표현으로 변환합니다.

ToString(String)

현재 IntPtr 개체의 숫자 값을 해당하는 문자열 표현으로 변환합니다.

ToString(String, IFormatProvider)

지정된 형식을 사용하여 현재 인스턴스의 값 형식을 지정합니다.

TrailingZeroCount(IntPtr)

값의 후행 0 수를 계산합니다.

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

현재 인스턴스의 값을 제공된 바이트 범위로 UTF-8로 서식을 지정하려고 시도합니다.

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

현재 인스턴스의 값을 제공된 문자 범위로 서식을 지정하려고 시도합니다.

TryParse(ReadOnlySpan<Byte>, IFormatProvider, IntPtr)

UTF-8 문자의 범위를 값으로 구문 분석하려고 시도합니다.

TryParse(ReadOnlySpan<Byte>, IntPtr)

숫자의 문자열 표현을 포함하는 UTF-8 문자 범위를 해당하는 부호 있는 정수로 변환하려고 시도합니다.

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

UTF-8 문자의 범위를 값으로 구문 분석하려고 시도합니다.

TryParse(ReadOnlySpan<Char>, IFormatProvider, IntPtr)

문자열을 값으로 구문 분석하려고 시도합니다.

TryParse(ReadOnlySpan<Char>, IntPtr)

숫자의 읽기 전용 문자 표현 범위를 해당하는 부호 있는 네이티브 정수로 변환합니다. 반환 값은 변환이 성공했는지 여부를 나타냅니다.

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

지정된 스타일 및 문화권별 형식으로 된 숫자의 읽기 전용 문자 표현 범위를 해당하는 부호 있는 네이티브 정수로 변환합니다. 반환 값은 변환이 성공했는지 여부를 나타냅니다.

TryParse(String, IFormatProvider, IntPtr)

문자열을 값으로 구문 분석하려고 시도합니다.

TryParse(String, IntPtr)

숫자의 문자열 표현을 해당하는 부호 있는 네이티브 정수로 변환합니다. 반환 값은 변환이 성공했는지 여부를 나타냅니다.

TryParse(String, NumberStyles, IFormatProvider, IntPtr)

지정된 스타일 및 문화권별 형식의 숫자 문자열 표현을 해당하는 부호 있는 네이티브 정수로 변환합니다. 반환 값은 변환이 성공했는지 여부를 나타냅니다.

연산자

Addition(IntPtr, Int32)

부인 정수에 오프셋을 추가합니다.

Equality(IntPtr, IntPtr)

지정된 두 IntPtr 인스턴스가 같은지 여부를 확인합니다.

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 인스턴스가 같지 않은지 여부를 확인합니다.

Subtraction(IntPtr, Int32)

부속 정수에서 오프셋을 뺍니다.

명시적 인터페이스 구현

IAdditionOperators<IntPtr,IntPtr,IntPtr>.Addition(IntPtr, IntPtr)

합계를 계산하기 위해 두 값을 함께 추가합니다.

IAdditionOperators<IntPtr,IntPtr,IntPtr>.CheckedAddition(IntPtr, IntPtr)

합계를 계산하기 위해 두 값을 함께 추가합니다.

IAdditiveIdentity<IntPtr,IntPtr>.AdditiveIdentity

현재 형식의 추가 ID를 가져옵니다.

IBinaryInteger<IntPtr>.GetByteCount()

TryWriteLittleEndian(Span<Byte>, Int32)일부로 기록될 바이트 수를 가져옵니다.

IBinaryInteger<IntPtr>.GetShortestBitLength()

현재 값에 대한 가장 짧은 두 개의 보수 표현의 길이(비트)를 가져옵니다.

IBinaryInteger<IntPtr>.TryReadBigEndian(ReadOnlySpan<Byte>, Boolean, IntPtr)

비트 너비가 포인터와 같은 부호 있는 정수입니다.

IBinaryInteger<IntPtr>.TryReadLittleEndian(ReadOnlySpan<Byte>, Boolean, IntPtr)

비트 너비가 포인터와 같은 부호 있는 정수입니다.

IBinaryInteger<IntPtr>.TryWriteBigEndian(Span<Byte>, Int32)

현재 값을 big-endian 형식으로 지정된 범위에 쓰려고 합니다.

IBinaryInteger<IntPtr>.TryWriteLittleEndian(Span<Byte>, Int32)

현재 값을 little-endian 형식으로 지정된 범위에 쓰려고 합니다.

IBinaryNumber<IntPtr>.AllBitsSet

모든 비트가 설정된 이진 형식의 인스턴스를 가져옵니다.

IBitwiseOperators<IntPtr,IntPtr,IntPtr>.BitwiseAnd(IntPtr, IntPtr)

두 값의 비트 및 값을 계산합니다.

IBitwiseOperators<IntPtr,IntPtr,IntPtr>.BitwiseOr(IntPtr, IntPtr)

비트 또는 두 값을 계산합니다.

IBitwiseOperators<IntPtr,IntPtr,IntPtr>.ExclusiveOr(IntPtr, IntPtr)

배타적 또는 두 값을 계산합니다.

IBitwiseOperators<IntPtr,IntPtr,IntPtr>.OnesComplement(IntPtr)

지정된 값의 보수 표현을 계산합니다.

IComparisonOperators<IntPtr,IntPtr,Boolean>.GreaterThan(IntPtr, IntPtr)

두 값을 비교하여 더 큰 값을 결정합니다.

IComparisonOperators<IntPtr,IntPtr,Boolean>.GreaterThanOrEqual(IntPtr, IntPtr)

두 값을 비교하여 크거나 같은 값을 결정합니다.

IComparisonOperators<IntPtr,IntPtr,Boolean>.LessThan(IntPtr, IntPtr)

두 값을 비교하여 더 적은 값을 결정합니다.

IComparisonOperators<IntPtr,IntPtr,Boolean>.LessThanOrEqual(IntPtr, IntPtr)

두 값을 비교하여 어느 값이 작거나 같은지 확인합니다.

IDecrementOperators<IntPtr>.CheckedDecrement(IntPtr)

값을 줄입니다.

IDecrementOperators<IntPtr>.Decrement(IntPtr)

값을 줄입니다.

IDivisionOperators<IntPtr,IntPtr,IntPtr>.Division(IntPtr, IntPtr)

한 값을 다른 값으로 나누어 몫을 계산합니다.

IEquatable<IntPtr>.Equals(IntPtr)

이 인스턴스가 다른 부속 정수와 같은지 여부를 나타내는 값을 반환합니다.

IIncrementOperators<IntPtr>.CheckedIncrement(IntPtr)

값을 증분합니다.

IIncrementOperators<IntPtr>.Increment(IntPtr)

값을 증분합니다.

IMinMaxValue<IntPtr>.MaxValue

현재 형식의 최대값을 가져옵니다.

IMinMaxValue<IntPtr>.MinValue

현재 형식의 최소값을 가져옵니다.

IModulusOperators<IntPtr,IntPtr,IntPtr>.Modulus(IntPtr, IntPtr)

두 값을 함께 나누어 모듈러스 또는 나머지를 계산합니다.

IMultiplicativeIdentity<IntPtr,IntPtr>.MultiplicativeIdentity

현재 형식의 곱하기 ID를 가져옵니다.

IMultiplyOperators<IntPtr,IntPtr,IntPtr>.CheckedMultiply(IntPtr, IntPtr)

두 값을 함께 곱하여 제품을 계산합니다.

IMultiplyOperators<IntPtr,IntPtr,IntPtr>.Multiply(IntPtr, IntPtr)

두 값을 함께 곱하여 제품을 계산합니다.

INumber<IntPtr>.MaxNumber(IntPtr, IntPtr)

두 값을 더 큰 컴퓨팅과 비교하고 입력이 NaN경우 다른 값을 반환합니다.

INumber<IntPtr>.MinNumber(IntPtr, IntPtr)

두 값을 더 작은 컴퓨팅과 비교하고 입력이 NaN경우 다른 값을 반환합니다.

INumberBase<IntPtr>.IsCanonical(IntPtr)

값이 정식 표현에 있는지 여부를 확인합니다.

INumberBase<IntPtr>.IsComplexNumber(IntPtr)

값이 복소수를 나타내는지 여부를 결정합니다.

INumberBase<IntPtr>.IsFinite(IntPtr)

값이 유한한지 여부를 확인합니다.

INumberBase<IntPtr>.IsImaginaryNumber(IntPtr)

값이 순수 허수 수를 나타내는지 여부를 확인합니다.

INumberBase<IntPtr>.IsInfinity(IntPtr)

값이 무한인지 여부를 확인합니다.

INumberBase<IntPtr>.IsInteger(IntPtr)

값이 정수인지 여부를 결정합니다.

INumberBase<IntPtr>.IsNaN(IntPtr)

값이 NaN인지 여부를 확인합니다.

INumberBase<IntPtr>.IsNegativeInfinity(IntPtr)

값이 음수 무한대인지 여부를 확인합니다.

INumberBase<IntPtr>.IsNormal(IntPtr)

값이 정상인지 여부를 확인합니다.

INumberBase<IntPtr>.IsPositiveInfinity(IntPtr)

값이 양의 무한대인지 여부를 확인합니다.

INumberBase<IntPtr>.IsRealNumber(IntPtr)

값이 실수인지 여부를 확인합니다.

INumberBase<IntPtr>.IsSubnormal(IntPtr)

값이 영수인지 여부를 확인합니다.

INumberBase<IntPtr>.IsZero(IntPtr)

값이 0인지 여부를 확인합니다.

INumberBase<IntPtr>.MaxMagnitudeNumber(IntPtr, IntPtr)

크기가 더 큰 컴퓨팅과 두 값을 비교하고 입력이 NaN경우 다른 값을 반환합니다.

INumberBase<IntPtr>.MinMagnitudeNumber(IntPtr, IntPtr)

크기가 작은 컴퓨팅과 두 값을 비교하고 입력이 NaN경우 다른 값을 반환합니다.

INumberBase<IntPtr>.MultiplyAddEstimate(IntPtr, IntPtr, IntPtr)

추정값(left * right) + addend계산합니다.

INumberBase<IntPtr>.One

형식에 대한 1 값을 가져옵니다.

INumberBase<IntPtr>.Radix

형식의 radix 또는 base를 가져옵니다.

INumberBase<IntPtr>.TryConvertFromChecked<TOther>(TOther, IntPtr)

비트 너비가 포인터와 같은 부호 있는 정수입니다.

INumberBase<IntPtr>.TryConvertFromSaturating<TOther>(TOther, IntPtr)

비트 너비가 포인터와 같은 부호 있는 정수입니다.

INumberBase<IntPtr>.TryConvertFromTruncating<TOther>(TOther, IntPtr)

비트 너비가 포인터와 같은 부호 있는 정수입니다.

INumberBase<IntPtr>.TryConvertToChecked<TOther>(IntPtr, TOther)

현재 형식의 인스턴스를 다른 형식으로 변환하여 현재 형식의 표시 가능한 범위를 벗어나는 값에 대해 오버플로 예외를 throw합니다.

INumberBase<IntPtr>.TryConvertToSaturating<TOther>(IntPtr, TOther)

현재 형식의 인스턴스를 다른 형식으로 변환하여 현재 형식의 표현 가능한 범위를 벗어나는 값을 채도합니다.

INumberBase<IntPtr>.TryConvertToTruncating<TOther>(IntPtr, TOther)

현재 형식의 인스턴스를 다른 형식으로 변환하여 현재 형식의 표현 가능한 범위를 벗어나는 값을 잘리려고 합니다.

INumberBase<IntPtr>.Zero

형식에 대한 0 값을 가져옵니다.

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

현재 IntPtr 개체를 serialize하는 데 필요한 데이터로 SerializationInfo 개체를 채웁니다.

IShiftOperators<IntPtr,Int32,IntPtr>.LeftShift(IntPtr, Int32)

지정된 양만큼 남은 값을 이동합니다.

IShiftOperators<IntPtr,Int32,IntPtr>.RightShift(IntPtr, Int32)

값을 지정된 양만큼 오른쪽으로 이동합니다.

IShiftOperators<IntPtr,Int32,IntPtr>.UnsignedRightShift(IntPtr, Int32)

값을 지정된 양만큼 오른쪽으로 이동합니다.

ISignedNumber<IntPtr>.NegativeOne

형식에 대한 -1 값을 가져옵니다.

ISubtractionOperators<IntPtr,IntPtr,IntPtr>.CheckedSubtraction(IntPtr, IntPtr)

두 값을 빼서 차이를 계산합니다.

ISubtractionOperators<IntPtr,IntPtr,IntPtr>.Subtraction(IntPtr, IntPtr)

두 값을 빼서 차이를 계산합니다.

IUnaryNegationOperators<IntPtr,IntPtr>.CheckedUnaryNegation(IntPtr)

값의 확인된 단항 부정을 계산합니다.

IUnaryNegationOperators<IntPtr,IntPtr>.UnaryNegation(IntPtr)

값의 단항 부정을 계산합니다.

IUnaryPlusOperators<IntPtr,IntPtr>.UnaryPlus(IntPtr)

값의 단항 플러스를 계산합니다.

적용 대상

스레드 보안

이 형식은 스레드로부터 안전합니다.

추가 정보