Compartilhar via


IntPtr Estrutura

Definição

Representa um inteiro com sinal em que a largura do bit é igual a um ponteiro.

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
Herança
IntPtr
Atributos
Implementações
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>

Exemplos

O exemplo a seguir usa ponteiros gerenciados para reverter os caracteres em uma matriz. Depois de inicializar um objeto String e obter seu comprimento, ele fará o seguinte:

  1. Chama o método Marshal.StringToHGlobalAnsi para copiar a cadeia de caracteres Unicode para memória não gerenciada como um caractere ANSI (um byte). O método retorna um objeto IntPtr que aponta para o início da cadeia de caracteres não gerenciada. O exemplo do Visual Basic usa esse ponteiro diretamente; nos exemplos C++, F# e C#, ele é convertido em um ponteiro para um byte.

  2. Chama o método Marshal.AllocHGlobal para alocar o mesmo número de bytes que a cadeia de caracteres não gerenciada ocupa. O método retorna um objeto IntPtr que aponta para o início do bloco de memória não gerenciado. O exemplo do Visual Basic usa esse ponteiro diretamente; nos exemplos C++, F# e C#, ele é convertido em um ponteiro para um byte.

  3. O exemplo do Visual Basic define uma variável chamada offset igual ao comprimento da cadeia de caracteres ANSI. Ele é usado para determinar o deslocamento na memória não gerenciada para a qual o próximo caractere na cadeia de caracteres ANSI é copiado. Como seu valor inicial é o comprimento da cadeia de caracteres, a operação de cópia copiará um caractere do início da cadeia de caracteres até o final do bloco de memória.

    Os exemplos de C#, F# e C++ chamam o método ToPointer para obter um ponteiro não gerenciado para o endereço inicial da cadeia de caracteres e o bloco de memória não gerenciado e adicionam um menor que o comprimento da cadeia de caracteres ao endereço inicial da cadeia de caracteres ANSI. Como o ponteiro de cadeia de caracteres não gerenciado agora aponta para o final da cadeia de caracteres, a operação de cópia copiará um caractere do final da cadeia de caracteres para o início do bloco de memória.

  4. Usa um loop para copiar cada caractere da cadeia de caracteres para o bloco de memória não gerenciado.

    O exemplo do Visual Basic chama o método Marshal.ReadByte(IntPtr, Int32) para ler o byte (ou caractere de um byte) em um deslocamento especificado do ponteiro gerenciado para a cadeia de caracteres ANSI. O deslocamento é incrementado com cada iteração do loop. Em seguida, ele chama o método Marshal.WriteByte(IntPtr, Int32, Byte) para gravar o byte no endereço de memória definido pelo endereço inicial do bloco de memória não gerenciado mais offset. Em seguida, ele diminui offset.

    Os exemplos de C#, F# e C++ executam a operação de cópia e, em seguida, decrementam o ponteiro para o endereço do próximo local na cadeia de caracteres ANSI não gerenciada e incrementam o ponteiro para o próximo endereço no bloco não gerenciado.

  5. Todos os exemplos chamam o Marshal.PtrToStringAnsi para converter o bloco de memória não gerenciado que contém a cadeia de caracteres ANSI copiada para um objeto Unicode String gerenciado.

  6. Depois de exibir as cadeias de caracteres originais e invertidas, todos os exemplos chamam o método FreeHGlobal para liberar a memória alocada para a cadeia de caracteres ANSI não gerenciada e o bloco de memória não gerenciado.

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

Comentários

O tipo IntPtr foi projetado para ser um inteiro cujo tamanho é o mesmo que um ponteiro. Ou seja, espera-se que uma instância desse tipo seja de 32 bits em um processo de 32 bits e 64 bits em um processo de 64 bits.

O tipo IntPtr pode ser usado por idiomas que dão suporte a ponteiros e como um meio comum de fazer referência a dados entre idiomas que dão suporte e não dão suporte a ponteiros.

IntPtr objetos também podem ser usados para armazenar identificadores. Por exemplo, instâncias de IntPtr são usadas extensivamente na classe System.IO.FileStream para manter identificadores de arquivo.

Nota

Usar IntPtr como ponteiro ou identificador é propenso a erros e não seguro. É simplesmente um tipo inteiro que pode ser usado como um formato de intercâmbio para ponteiros e identificadores devido ao mesmo tamanho. Fora dos requisitos de intercâmbio específicos, como passar dados para um idioma que não dá suporte a ponteiros, um ponteiro digitado corretamente deve ser usado para representar ponteiros e SafeHandle deve ser usado para representar identificadores.

Esse tipo implementa o ISerializable. No .NET 5 e versões posteriores, esse tipo também implementa as interfaces de IFormattable. No .NET 7 e versões posteriores, esse tipo também implementa as interfaces IBinaryInteger<TSelf>, IMinMaxValue<TSelf>e ISignedNumber<TSelf>.

No C# a partir da versão 9.0, você pode usar o tipo de nint interno para definir inteiros de tamanho nativo. Esse tipo é representado pelo tipo IntPtr internamente e fornece operações e conversões apropriadas para tipos inteiros. Para obter mais informações, consulte tipos nint e nuint.

No C# a partir da versão 11 e ao direcionar o runtime do .NET 7 ou posterior, nint é um alias para IntPtr da mesma forma que int é um alias para Int32.

Construtores

IntPtr(Int32)

Inicializa uma nova instância de IntPtr usando o inteiro com sinal de 32 bits especificado.

IntPtr(Int64)

Inicializa uma nova instância de IntPtr usando o inteiro com sinal de 64 bits especificado.

IntPtr(Void*)

Inicializa uma nova instância de IntPtr usando o ponteiro especificado para um tipo não especificado.

Campos

Zero

Um campo somente leitura que representa um inteiro com sinal que foi inicializado como zero.

Propriedades

MaxValue

Obtém o maior valor possível de IntPtr.

MinValue

Obtém o menor valor possível de IntPtr.

Size

Obtém o tamanho dessa instância.

Métodos

Abs(IntPtr)

Calcula o absoluto de um valor.

Add(IntPtr, Int32)

Adiciona um deslocamento a um inteiro com sinal.

Clamp(IntPtr, IntPtr, IntPtr)

Fixa um valor a um valor mínimo inclusivo e máximo.

CompareTo(IntPtr)

Compara a instância atual com outro objeto do mesmo tipo e retorna um inteiro que indica se a instância atual precede, segue ou ocorre na mesma posição na ordem de classificação que o outro objeto.

CompareTo(Object)

Compara a instância atual com outro objeto do mesmo tipo e retorna um inteiro que indica se a instância atual precede, segue ou ocorre na mesma posição na ordem de classificação que o outro objeto.

CopySign(IntPtr, IntPtr)

Copia o sinal de um valor para o sinal de outro valor.

CreateChecked<TOther>(TOther)

Cria uma instância do tipo atual de um valor, gerando uma exceção de estouro para quaisquer valores que fiquem fora do intervalo representável do tipo atual.

CreateSaturating<TOther>(TOther)

Cria uma instância do tipo atual de um valor, saturando todos os valores que estão fora do intervalo representável do tipo atual.

CreateTruncating<TOther>(TOther)

Cria uma instância do tipo atual de um valor, truncando todos os valores que estão fora do intervalo representável do tipo atual.

DivRem(IntPtr, IntPtr)

Calcula o quociente e o restante de dois valores.

Equals(IntPtr)

Indica se o objeto atual é igual a outro objeto do mesmo tipo.

Equals(Object)

Retorna um valor que indica se essa instância é igual a um objeto especificado.

GetHashCode()

Retorna o código hash dessa instância.

IsEvenInteger(IntPtr)

Determina se um valor representa um número integral par.

IsNegative(IntPtr)

Determina se um valor é negativo.

IsOddInteger(IntPtr)

Determina se um valor representa um número integral ímpar.

IsPositive(IntPtr)

Determina se um valor é positivo.

IsPow2(IntPtr)

Determina se um valor é uma potência de dois.

LeadingZeroCount(IntPtr)

Calcula o número de zeros à esquerda em um valor.

Log2(IntPtr)

Calcula o log2 de um valor.

Max(IntPtr, IntPtr)

Compara dois valores com a computação que é maior.

MaxMagnitude(IntPtr, IntPtr)

Compara dois valores com a computação que é maior.

Min(IntPtr, IntPtr)

Compara dois valores com a computação menor.

MinMagnitude(IntPtr, IntPtr)

Compara dois valores com a computação menor.

Parse(ReadOnlySpan<Byte>, IFormatProvider)

Analisa um intervalo de caracteres UTF-8 em um valor.

Parse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider)

Analisa um intervalo de caracteres UTF-8 em um valor.

Parse(ReadOnlySpan<Char>, IFormatProvider)

Analisa um intervalo de caracteres em um valor.

Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider)

Converte o intervalo somente leitura de representação de caracteres de um número em um formato específico de cultura e estilo especificado em seu inteiro nativo com sinal equivalente.

Parse(String)

Converte a representação de cadeia de caracteres de um número em seu inteiro nativo com sinal equivalente.

Parse(String, IFormatProvider)

Converte a representação de cadeia de caracteres de um número em um formato específico à cultura especificado em seu equivalente inteiro nativo assinado.

Parse(String, NumberStyles)

Converte a representação de cadeia de caracteres de um número em um estilo especificado em seu equivalente inteiro nativo assinado.

Parse(String, NumberStyles, IFormatProvider)

Converte a representação de cadeia de caracteres de um número em um formato específico de estilo e cultura especificado em seu inteiro nativo com sinal equivalente.

PopCount(IntPtr)

Calcula o número de bits definidos em um valor.

RotateLeft(IntPtr, Int32)

Gira um valor deixado por um determinado valor.

RotateRight(IntPtr, Int32)

Gira um valor à direita em um determinado valor.

Sign(IntPtr)

Calcula o sinal de um valor.

Subtract(IntPtr, Int32)

Subtrai um deslocamento de um inteiro com sinal.

ToInt32()

Converte o valor dessa instância em um inteiro com sinal de 32 bits.

ToInt64()

Converte o valor dessa instância em um inteiro com sinal de 64 bits.

ToPointer()

Converte o valor dessa instância em um ponteiro em um tipo não especificado.

ToString()

Converte o valor numérico do objeto IntPtr atual em sua representação de cadeia de caracteres equivalente.

ToString(IFormatProvider)

Converte o valor numérico dessa instância em sua representação de cadeia de caracteres equivalente usando o formato especificado e as informações de formato específicas da cultura.

ToString(String)

Converte o valor numérico do objeto IntPtr atual em sua representação de cadeia de caracteres equivalente.

ToString(String, IFormatProvider)

Formata o valor da instância atual usando o formato especificado.

TrailingZeroCount(IntPtr)

Calcula o número de zeros à direita em um valor.

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

Tenta formatar o valor da instância atual como UTF-8 no intervalo de bytes fornecido.

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

Tenta formatar o valor da instância atual no intervalo de caracteres fornecido.

TryParse(ReadOnlySpan<Byte>, IFormatProvider, IntPtr)

Tenta analisar um intervalo de caracteres UTF-8 em um valor.

TryParse(ReadOnlySpan<Byte>, IntPtr)

Tenta converter um intervalo de caracteres UTF-8 que contém a representação de cadeia de caracteres de um número em seu inteiro com sinal equivalente.

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

Tenta analisar um intervalo de caracteres UTF-8 em um valor.

TryParse(ReadOnlySpan<Char>, IFormatProvider, IntPtr)

Tenta analisar uma cadeia de caracteres em um valor.

TryParse(ReadOnlySpan<Char>, IntPtr)

Converte o intervalo somente leitura de representação de caracteres de um número em seu equivalente inteiro nativo assinado. Um valor retornado indica se a conversão foi bem-sucedida.

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

Converte o intervalo somente leitura de representação de caracteres de um número em um formato específico de cultura e estilo especificado em seu inteiro nativo com sinal equivalente. Um valor retornado indica se a conversão foi bem-sucedida.

TryParse(String, IFormatProvider, IntPtr)

Tenta analisar uma cadeia de caracteres em um valor.

TryParse(String, IntPtr)

Converte a representação de cadeia de caracteres de um número em seu inteiro nativo com sinal equivalente. Um valor retornado indica se a conversão foi bem-sucedida.

TryParse(String, NumberStyles, IFormatProvider, IntPtr)

Converte a representação de cadeia de caracteres de um número em um formato específico de estilo e cultura especificado em seu inteiro nativo com sinal equivalente. Um valor retornado indica se a conversão foi bem-sucedida.

Operadores

Addition(IntPtr, Int32)

Adiciona um deslocamento a um inteiro com sinal.

Equality(IntPtr, IntPtr)

Determina se duas instâncias especificadas de IntPtr são iguais.

Explicit(Int32 to IntPtr)

Converte o valor de um inteiro com sinal de 32 bits em um IntPtr.

Explicit(Int64 to IntPtr)

Converte o valor de um inteiro com sinal de 64 bits em um IntPtr.

Explicit(IntPtr to Int32)

Converte o valor do IntPtr especificado em um inteiro com sinal de 32 bits.

Explicit(IntPtr to Int64)

Converte o valor do IntPtr especificado em um inteiro com sinal de 64 bits.

Explicit(IntPtr to Void*)

Converte o valor do IntPtr especificado em um ponteiro para um tipo não especificado.

Essa API não é compatível com CLS.

Explicit(Void* to IntPtr)

Converte o ponteiro especificado em um tipo não especificado em um IntPtr.

Essa API não é compatível com CLS.

Inequality(IntPtr, IntPtr)

Determina se duas instâncias especificadas de IntPtr não são iguais.

Subtraction(IntPtr, Int32)

Subtrai um deslocamento de um inteiro com sinal.

Implantações explícitas de interface

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

Adiciona dois valores juntos para calcular sua soma.

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

Adiciona dois valores juntos para calcular sua soma.

IAdditiveIdentity<IntPtr,IntPtr>.AdditiveIdentity

Obtém a identidade aditiva do tipo atual.

IBinaryInteger<IntPtr>.GetByteCount()

Obtém o número de bytes que serão gravados como parte de TryWriteLittleEndian(Span<Byte>, Int32).

IBinaryInteger<IntPtr>.GetShortestBitLength()

Obtém o comprimento, em bits, da representação complementar dos dois mais curtos do valor atual.

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

Representa um inteiro com sinal em que a largura do bit é igual a um ponteiro.

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

Representa um inteiro com sinal em que a largura do bit é igual a um ponteiro.

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

Tenta gravar o valor atual, no formato big-endian, em um determinado intervalo.

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

Tenta gravar o valor atual, no formato little-endian, em um determinado intervalo.

IBinaryNumber<IntPtr>.AllBitsSet

Obtém uma instância do tipo binário na qual todos os bits são definidos.

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

Calcula o bit a bit e dois valores.

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

Calcula o bit a bit ou de dois valores.

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

Calcula o exclusivo ou de dois valores.

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

Calcula a representação ones-complement de um determinado valor.

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

Compara dois valores para determinar qual é maior.

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

Compara dois valores para determinar qual é maior ou igual.

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

Compara dois valores para determinar qual é menor.

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

Compara dois valores para determinar qual é menor ou igual.

IDecrementOperators<IntPtr>.CheckedDecrement(IntPtr)

Decrementa um valor.

IDecrementOperators<IntPtr>.Decrement(IntPtr)

Decrementa um valor.

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

Divide um valor por outro para calcular seu quociente.

IEquatable<IntPtr>.Equals(IntPtr)

Retorna um valor que indica se essa instância é igual a outro inteiro com sinal.

IIncrementOperators<IntPtr>.CheckedIncrement(IntPtr)

Incrementa um valor.

IIncrementOperators<IntPtr>.Increment(IntPtr)

Incrementa um valor.

IMinMaxValue<IntPtr>.MaxValue

Obtém o valor máximo do tipo atual.

IMinMaxValue<IntPtr>.MinValue

Obtém o valor mínimo do tipo atual.

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

Divide dois valores juntos para calcular seu módulo ou restante.

IMultiplicativeIdentity<IntPtr,IntPtr>.MultiplicativeIdentity

Obtém a identidade multiplicativa do tipo atual.

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

Multiplica dois valores juntos para calcular seu produto.

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

Multiplica dois valores juntos para calcular seu produto.

INumber<IntPtr>.MaxNumber(IntPtr, IntPtr)

Compara dois valores com a computação, que é maior e retorna o outro valor se uma entrada é NaN.

INumber<IntPtr>.MinNumber(IntPtr, IntPtr)

Compara dois valores com a computação que é menor e retorna o outro valor se uma entrada é NaN.

INumberBase<IntPtr>.IsCanonical(IntPtr)

Determina se um valor está em sua representação canônica.

INumberBase<IntPtr>.IsComplexNumber(IntPtr)

Determina se um valor representa um número complexo.

INumberBase<IntPtr>.IsFinite(IntPtr)

Determina se um valor é finito.

INumberBase<IntPtr>.IsImaginaryNumber(IntPtr)

Determina se um valor representa um número imaginário puro.

INumberBase<IntPtr>.IsInfinity(IntPtr)

Determina se um valor é infinito.

INumberBase<IntPtr>.IsInteger(IntPtr)

Determina se um valor representa um número integral.

INumberBase<IntPtr>.IsNaN(IntPtr)

Determina se um valor é NaN.

INumberBase<IntPtr>.IsNegativeInfinity(IntPtr)

Determina se um valor é infinito negativo.

INumberBase<IntPtr>.IsNormal(IntPtr)

Determina se um valor é normal.

INumberBase<IntPtr>.IsPositiveInfinity(IntPtr)

Determina se um valor é infinito positivo.

INumberBase<IntPtr>.IsRealNumber(IntPtr)

Determina se um valor representa um número real.

INumberBase<IntPtr>.IsSubnormal(IntPtr)

Determina se um valor é subnormal.

INumberBase<IntPtr>.IsZero(IntPtr)

Determina se um valor é zero.

INumberBase<IntPtr>.MaxMagnitudeNumber(IntPtr, IntPtr)

Compara dois valores com a computação que tem maior magnitude e retorna o outro valor se uma entrada é NaN.

INumberBase<IntPtr>.MinMagnitudeNumber(IntPtr, IntPtr)

Compara dois valores com a computação que tem a menor magnitude e retorna o outro valor se uma entrada é NaN.

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

Calcula uma estimativa de (left * right) + addend.

INumberBase<IntPtr>.One

Obtém o valor 1 para o tipo.

INumberBase<IntPtr>.Radix

Obtém o radix, ou base, para o tipo.

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

Representa um inteiro com sinal em que a largura do bit é igual a um ponteiro.

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

Representa um inteiro com sinal em que a largura do bit é igual a um ponteiro.

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

Representa um inteiro com sinal em que a largura do bit é igual a um ponteiro.

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

Tenta converter uma instância do tipo atual em outro tipo, gerando uma exceção de estouro para quaisquer valores que fiquem fora do intervalo representável do tipo atual.

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

Tenta converter uma instância do tipo atual em outro tipo, saturando todos os valores que estão fora do intervalo representável do tipo atual.

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

Tenta converter uma instância do tipo atual em outro tipo, truncando todos os valores que estejam fora do intervalo representável do tipo atual.

INumberBase<IntPtr>.Zero

Obtém o valor 0 para o tipo.

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Popula um objeto SerializationInfo com os dados necessários para serializar o objeto IntPtr atual.

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

Desloca um valor deixado por um determinado valor.

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

Desloca um valor para a direita por um determinado valor.

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

Desloca um valor para a direita por um determinado valor.

ISignedNumber<IntPtr>.NegativeOne

Obtém o valor -1 para o tipo.

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

Subtrai dois valores para calcular a diferença.

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

Subtrai dois valores para calcular a diferença.

IUnaryNegationOperators<IntPtr,IntPtr>.CheckedUnaryNegation(IntPtr)

Calcula a negação unária verificada de um valor.

IUnaryNegationOperators<IntPtr,IntPtr>.UnaryNegation(IntPtr)

Calcula a negação unária de um valor.

IUnaryPlusOperators<IntPtr,IntPtr>.UnaryPlus(IntPtr)

Calcula a adição unária de um valor.

Aplica-se a

Acesso thread-safe

Esse tipo é thread safe.

Confira também