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 하 여 유니코드 문자열을 관리 되지 않는 메모리에 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 예제에서는 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 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 문자열의 시작 주소에 추가 합니다.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 하 여 복사 된 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.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 bit 하드웨어 및 운영 체제의 경우 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 .net 5.0 이상에서 인터페이스를 구현 합니다 IFormattable .This type implements the ISerializable, and, in .NET 5.0 and later, the IFormattable interfaces.

생성자

IntPtr(Int32)

지정된 64비트 포인터나 핸들을 사용하여 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의 지정된 두 인스턴스가 같은지를 확인합니다.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의 지정된 두 인스턴스가 다른지를 확인합니다.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 개체를 serialize하는 데 필요한 데이터로 IntPtr 개체를 채웁니다.Populates a SerializationInfo object with the data needed to serialize the current IntPtr object.

적용 대상

스레드 보안

이 형식은 스레드로부터 안전합니다.This type is thread safe.

추가 정보