Partager via


IntPtr Structure

Définition

Représente un entier signé où la largeur du bit est identique à un pointeur.

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
Héritage
IntPtr
Attributs
Implémente
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>

Exemples

L’exemple suivant utilise des pointeurs managés pour inverser les caractères d’un tableau. Une fois qu’il initialise un objet String et obtient sa longueur, il effectue les opérations suivantes :

  1. Appelle la méthode Marshal.StringToHGlobalAnsi pour copier la chaîne Unicode en mémoire non managée en tant que caractère ANSI (un octet). La méthode retourne un objet IntPtr qui pointe vers le début de la chaîne non managée. L’exemple Visual Basic utilise directement ce pointeur ; dans les exemples C++, F# et C#, il est converti en pointeur vers un octet.

  2. Appelle la méthode Marshal.AllocHGlobal pour allouer le même nombre d’octets que la chaîne non managée occupe. La méthode retourne un objet IntPtr qui pointe vers le début du bloc de mémoire non managé. L’exemple Visual Basic utilise directement ce pointeur ; dans les exemples C++, F# et C#, il est converti en pointeur vers un octet.

  3. L’exemple Visual Basic définit une variable nommée offset égale à la longueur de la chaîne ANSI. Il est utilisé pour déterminer le décalage en mémoire non managée vers laquelle le caractère suivant de la chaîne ANSI est copié. Étant donné que sa valeur de départ est la longueur de la chaîne, l’opération de copie copie copie un caractère du début de la chaîne à la fin du bloc de mémoire.

    Les exemples C#, F# et C++ appellent la méthode ToPointer pour obtenir un pointeur non managé vers l’adresse de départ de la chaîne et le bloc de mémoire non managé, et ils ajoutent une valeur inférieure à la longueur de la chaîne à l’adresse de départ de la chaîne ANSI. Étant donné que le pointeur de chaîne non managé pointe maintenant vers la fin de la chaîne, l’opération de copie copie copiera un caractère de la fin de la chaîne au début du bloc de mémoire.

  4. Utilise une boucle pour copier chaque caractère de la chaîne vers le bloc de mémoire non managé.

    L’exemple Visual Basic appelle la méthode Marshal.ReadByte(IntPtr, Int32) pour lire l’octet (ou un caractère d’un octet) à un décalage spécifié du pointeur managé vers la chaîne ANSI. Le décalage est incrémenté avec chaque itération de la boucle. Il appelle ensuite la méthode Marshal.WriteByte(IntPtr, Int32, Byte) pour écrire l’octet dans l’adresse mémoire définie par l’adresse de départ du bloc de mémoire non managé plus offset. Il décrémente ensuite offset.

    Les exemples C#, F# et C++ effectuent l’opération de copie, puis décrémentent le pointeur vers l’adresse de l’emplacement suivant dans la chaîne ANSI non managée et incrémentent le pointeur à l’adresse suivante dans le bloc non managé.

  5. Tous les exemples appellent la Marshal.PtrToStringAnsi pour convertir le bloc de mémoire non managé contenant la chaîne ANSI copiée en objet String Unicode managé.

  6. Après avoir affiché les chaînes d’origine et inversées, tous les exemples appellent la méthode FreeHGlobal pour libérer la mémoire allouée pour la chaîne ANSI non managée et le bloc de mémoire non managé.

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

Remarques

Le type IntPtr est conçu pour être un entier dont la taille est identique à un pointeur. Autrement dit, une instance de ce type devrait être de 32 bits dans un processus 32 bits et 64 bits dans un processus 64 bits.

Le type IntPtr peut être utilisé par les langages qui prennent en charge les pointeurs et comme moyen courant de faire référence aux données entre les langages qui ne prennent pas en charge les pointeurs.

IntPtr objets peuvent également être utilisés pour contenir des handles. Par exemple, les instances de IntPtr sont largement utilisées dans la classe System.IO.FileStream pour contenir des handles de fichiers.

Note

L’utilisation de IntPtr en tant que pointeur ou handle est sujette à des erreurs et dangereuses. Il s’agit simplement d’un type entier qui peut être utilisé comme format d’échange pour les pointeurs et les handles en raison d’une taille identique. En dehors des exigences d’échange spécifiques, telles que la transmission de données à un langage qui ne prend pas en charge les pointeurs, un pointeur correctement typé doit être utilisé pour représenter des pointeurs et SafeHandle doit être utilisé pour représenter des handles.

Ce type implémente le ISerializable. Dans .NET 5 et versions ultérieures, ce type implémente également les interfaces IFormattable. Dans .NET 7 et versions ultérieures, ce type implémente également les interfaces IBinaryInteger<TSelf>, IMinMaxValue<TSelf>et ISignedNumber<TSelf>.

En C# à partir de la version 9.0, vous pouvez utiliser le type de nint intégré pour définir des entiers de taille native. Ce type est représenté par le type IntPtr en interne et fournit des opérations et des conversions appropriées pour les types entiers. Pour plus d’informations, consultez types nint et nuint.

En C# à partir de la version 11 et lors du ciblage du runtime .NET 7 ou ultérieur, nint est un alias pour IntPtr de la même façon que int est un alias pour Int32.

Constructeurs

IntPtr(Int32)

Initialise une nouvelle instance de IntPtr à l’aide de l’entier signé 32 bits spécifié.

IntPtr(Int64)

Initialise une nouvelle instance de IntPtr à l’aide de l’entier signé 64 bits spécifié.

IntPtr(Void*)

Initialise une nouvelle instance de IntPtr à l’aide du pointeur spécifié vers un type non spécifié.

Champs

Zero

Champ en lecture seule qui représente un entier signé qui a été initialisé à zéro.

Propriétés

MaxValue

Obtient la plus grande valeur possible de IntPtr.

MinValue

Obtient la plus petite valeur possible de IntPtr.

Size

Obtient la taille de cette instance.

Méthodes

Abs(IntPtr)

Calcule l’absolu d’une valeur.

Add(IntPtr, Int32)

Ajoute un décalage à un entier signé.

Clamp(IntPtr, IntPtr, IntPtr)

Limite une valeur à une valeur minimale et maximale inclusive.

CompareTo(IntPtr)

Compare l’instance actuelle à un autre objet du même type et retourne un entier qui indique si l’instance actuelle précède, suit ou se produit à la même position dans l’ordre de tri que l’autre objet.

CompareTo(Object)

Compare l’instance actuelle à un autre objet du même type et retourne un entier qui indique si l’instance actuelle précède, suit ou se produit à la même position dans l’ordre de tri que l’autre objet.

CopySign(IntPtr, IntPtr)

Copie le signe d’une valeur au signe d’une autre valeur.

CreateChecked<TOther>(TOther)

Crée une instance du type actuel à partir d’une valeur, lève une exception de dépassement de capacité pour toutes les valeurs qui se trouvent en dehors de la plage représentée du type actuel.

CreateSaturating<TOther>(TOther)

Crée une instance du type actuel à partir d’une valeur, en saturant toutes les valeurs qui se trouvent en dehors de la plage représentée du type actuel.

CreateTruncating<TOther>(TOther)

Crée une instance du type actuel à partir d’une valeur, tronqué toutes les valeurs qui se trouvent en dehors de la plage représentée du type actuel.

DivRem(IntPtr, IntPtr)

Calcule le quotient et le reste de deux valeurs.

Equals(IntPtr)

Indique si l’objet actuel est égal à un autre objet du même type.

Equals(Object)

Retourne une valeur indiquant si cette instance est égale à un objet spécifié.

GetHashCode()

Retourne le code de hachage pour cette instance.

IsEvenInteger(IntPtr)

Détermine si une valeur représente un nombre intégral pair.

IsNegative(IntPtr)

Détermine si une valeur est négative.

IsOddInteger(IntPtr)

Détermine si une valeur représente un nombre intégral impair.

IsPositive(IntPtr)

Détermine si une valeur est positive.

IsPow2(IntPtr)

Détermine si une valeur est une puissance de deux.

LeadingZeroCount(IntPtr)

Calcule le nombre de zéros non significatifs dans une valeur.

Log2(IntPtr)

Calcule le journal2 d’une valeur.

Max(IntPtr, IntPtr)

Compare deux valeurs au calcul, ce qui est supérieur.

MaxMagnitude(IntPtr, IntPtr)

Compare deux valeurs au calcul, ce qui est supérieur.

Min(IntPtr, IntPtr)

Compare deux valeurs au calcul, ce qui est inférieur.

MinMagnitude(IntPtr, IntPtr)

Compare deux valeurs au calcul, ce qui est inférieur.

Parse(ReadOnlySpan<Byte>, IFormatProvider)

Analyse une étendue de caractères UTF-8 en une valeur.

Parse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider)

Analyse une étendue de caractères UTF-8 en une valeur.

Parse(ReadOnlySpan<Char>, IFormatProvider)

Analyse une étendue de caractères en une valeur.

Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider)

Convertit l’étendue en lecture seule de la représentation de caractères d’un nombre dans un style et un format spécifique à la culture spécifiés en son équivalent entier natif signé.

Parse(String)

Convertit la représentation sous forme de chaîne d’un nombre en entier natif signé équivalent.

Parse(String, IFormatProvider)

Convertit la représentation sous forme de chaîne d’un nombre dans un format spécifique à la culture spécifié en son équivalent entier natif signé.

Parse(String, NumberStyles)

Convertit la représentation sous forme de chaîne d’un nombre dans un style spécifié en son équivalent entier natif signé.

Parse(String, NumberStyles, IFormatProvider)

Convertit la représentation sous forme de chaîne d’un nombre dans un style et un format spécifique à la culture spécifiés en son équivalent entier natif signé.

PopCount(IntPtr)

Calcule le nombre de bits définis dans une valeur.

RotateLeft(IntPtr, Int32)

Fait pivoter une valeur à gauche d’une quantité donnée.

RotateRight(IntPtr, Int32)

Fait pivoter une valeur à droite d’un montant donné.

Sign(IntPtr)

Calcule le signe d’une valeur.

Subtract(IntPtr, Int32)

Soustrait un décalage d’un entier signé.

ToInt32()

Convertit la valeur de cette instance en entier signé 32 bits.

ToInt64()

Convertit la valeur de cette instance en entier signé 64 bits.

ToPointer()

Convertit la valeur de cette instance en pointeur en type non spécifié.

ToString()

Convertit la valeur numérique de l’objet IntPtr actuel en sa représentation sous forme de chaîne équivalente.

ToString(IFormatProvider)

Convertit la valeur numérique de cette instance en sa représentation sous forme de chaîne équivalente à l’aide des informations de format spécifiques à la culture et au format spécifiés.

ToString(String)

Convertit la valeur numérique de l’objet IntPtr actuel en sa représentation sous forme de chaîne équivalente.

ToString(String, IFormatProvider)

Met en forme la valeur de l’instance actuelle à l’aide du format spécifié.

TrailingZeroCount(IntPtr)

Calcule le nombre de zéros de fin dans une valeur.

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

Tente de mettre en forme la valeur de l’instance actuelle en UTF-8 dans l’étendue fournie d’octets.

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

Tente de mettre en forme la valeur de l’instance actuelle dans l’étendue fournie de caractères.

TryParse(ReadOnlySpan<Byte>, IFormatProvider, IntPtr)

Tente d’analyser une étendue de caractères UTF-8 en une valeur.

TryParse(ReadOnlySpan<Byte>, IntPtr)

Tente de convertir une étendue de caractères UTF-8 contenant la représentation sous forme de chaîne d’un nombre en son équivalent entier signé.

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

Tente d’analyser une étendue de caractères UTF-8 en une valeur.

TryParse(ReadOnlySpan<Char>, IFormatProvider, IntPtr)

Tente d’analyser une chaîne en une valeur.

TryParse(ReadOnlySpan<Char>, IntPtr)

Convertit l’étendue en lecture seule de caractères représentant un nombre en son équivalent entier natif signé. Une valeur de retour indique si la conversion a réussi.

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

Convertit l’étendue en lecture seule de la représentation de caractères d’un nombre dans un style et un format spécifique à la culture spécifiés en son équivalent entier natif signé. Une valeur de retour indique si la conversion a réussi.

TryParse(String, IFormatProvider, IntPtr)

Tente d’analyser une chaîne en une valeur.

TryParse(String, IntPtr)

Convertit la représentation sous forme de chaîne d’un nombre en entier natif signé équivalent. Une valeur de retour indique si la conversion a réussi.

TryParse(String, NumberStyles, IFormatProvider, IntPtr)

Convertit la représentation sous forme de chaîne d’un nombre dans un style et un format spécifique à la culture spécifiés en son équivalent entier natif signé. Une valeur de retour indique si la conversion a réussi.

Opérateurs

Addition(IntPtr, Int32)

Ajoute un décalage à un entier signé.

Equality(IntPtr, IntPtr)

Détermine si deux instances spécifiées de IntPtr sont égales.

Explicit(Int32 to IntPtr)

Convertit la valeur d’un entier signé 32 bits en IntPtr.

Explicit(Int64 to IntPtr)

Convertit la valeur d’un entier signé 64 bits en IntPtr.

Explicit(IntPtr to Int32)

Convertit la valeur du IntPtr spécifié en entier signé 32 bits.

Explicit(IntPtr to Int64)

Convertit la valeur du IntPtr spécifié en entier signé 64 bits.

Explicit(IntPtr to Void*)

Convertit la valeur du IntPtr spécifié en pointeur en type non spécifié.

Cette API n’est pas conforme CLS.

Explicit(Void* to IntPtr)

Convertit le pointeur spécifié en type non spécifié en IntPtr.

Cette API n’est pas conforme CLS.

Inequality(IntPtr, IntPtr)

Détermine si deux instances spécifiées de IntPtr ne sont pas égales.

Subtraction(IntPtr, Int32)

Soustrait un décalage d’un entier signé.

Implémentations d’interfaces explicites

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

Ajoute deux valeurs ensemble pour calculer leur somme.

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

Ajoute deux valeurs ensemble pour calculer leur somme.

IAdditiveIdentity<IntPtr,IntPtr>.AdditiveIdentity

Obtient l’identité additive du type actuel.

IBinaryInteger<IntPtr>.GetByteCount()

Obtient le nombre d’octets qui seront écrits dans le cadre de TryWriteLittleEndian(Span<Byte>, Int32).

IBinaryInteger<IntPtr>.GetShortestBitLength()

Obtient la longueur, en bits, de la représentation complète des deux plus courtes de la valeur actuelle.

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

Représente un entier signé où la largeur du bit est identique à un pointeur.

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

Représente un entier signé où la largeur du bit est identique à un pointeur.

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

Tente d’écrire la valeur actuelle, au format big-endian, dans une étendue donnée.

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

Tente d’écrire la valeur actuelle, au format little-endian, dans une étendue donnée.

IBinaryNumber<IntPtr>.AllBitsSet

Obtient une instance du type binaire dans laquelle tous les bits sont définis.

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

Calcule les valeurs au niveau du bit et de deux valeurs.

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

Calcule les valeurs au niveau du bit ou de deux valeurs.

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

Calcule les valeurs exclusives ou de deux valeurs.

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

Calcule la représentation complète d’une valeur donnée.

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

Compare deux valeurs pour déterminer ce qui est supérieur.

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

Compare deux valeurs pour déterminer qui est supérieur ou égal.

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

Compare deux valeurs pour déterminer ce qui est inférieur.

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

Compare deux valeurs pour déterminer qui est inférieure ou égale.

IDecrementOperators<IntPtr>.CheckedDecrement(IntPtr)

Décrémente une valeur.

IDecrementOperators<IntPtr>.Decrement(IntPtr)

Décrémente une valeur.

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

Divise une valeur par une autre pour calculer leur quotient.

IEquatable<IntPtr>.Equals(IntPtr)

Retourne une valeur qui indique si cette instance est égale à un autre entier signé.

IIncrementOperators<IntPtr>.CheckedIncrement(IntPtr)

Incrémente une valeur.

IIncrementOperators<IntPtr>.Increment(IntPtr)

Incrémente une valeur.

IMinMaxValue<IntPtr>.MaxValue

Obtient la valeur maximale du type actuel.

IMinMaxValue<IntPtr>.MinValue

Obtient la valeur minimale du type actuel.

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

Divise deux valeurs ensemble pour calculer leur module ou leur reste.

IMultiplicativeIdentity<IntPtr,IntPtr>.MultiplicativeIdentity

Obtient l’identité multiplicative du type actuel.

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

Multiplie deux valeurs ensemble pour calculer leur produit.

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

Multiplie deux valeurs ensemble pour calculer leur produit.

INumber<IntPtr>.MaxNumber(IntPtr, IntPtr)

Compare deux valeurs au calcul qui est supérieure et retourne l’autre valeur si une entrée est NaN.

INumber<IntPtr>.MinNumber(IntPtr, IntPtr)

Compare deux valeurs au calcul, ce qui est inférieur et retourne l’autre valeur si une entrée est NaN.

INumberBase<IntPtr>.IsCanonical(IntPtr)

Détermine si une valeur se trouve dans sa représentation canonique.

INumberBase<IntPtr>.IsComplexNumber(IntPtr)

Détermine si une valeur représente un nombre complexe.

INumberBase<IntPtr>.IsFinite(IntPtr)

Détermine si une valeur est finie.

INumberBase<IntPtr>.IsImaginaryNumber(IntPtr)

Détermine si une valeur représente un nombre imaginaire pur.

INumberBase<IntPtr>.IsInfinity(IntPtr)

Détermine si une valeur est infinie.

INumberBase<IntPtr>.IsInteger(IntPtr)

Détermine si une valeur représente un nombre intégral.

INumberBase<IntPtr>.IsNaN(IntPtr)

Détermine si une valeur est NaN.

INumberBase<IntPtr>.IsNegativeInfinity(IntPtr)

Détermine si une valeur est l’infini négatif.

INumberBase<IntPtr>.IsNormal(IntPtr)

Détermine si une valeur est normale.

INumberBase<IntPtr>.IsPositiveInfinity(IntPtr)

Détermine si une valeur est l’infini positif.

INumberBase<IntPtr>.IsRealNumber(IntPtr)

Détermine si une valeur représente un nombre réel.

INumberBase<IntPtr>.IsSubnormal(IntPtr)

Détermine si une valeur est subnormale.

INumberBase<IntPtr>.IsZero(IntPtr)

Détermine si une valeur est égale à zéro.

INumberBase<IntPtr>.MaxMagnitudeNumber(IntPtr, IntPtr)

Compare deux valeurs au calcul qui a la plus grande magnitude et retourne l’autre valeur si une entrée est NaN.

INumberBase<IntPtr>.MinMagnitudeNumber(IntPtr, IntPtr)

Compare deux valeurs au calcul dont la magnitude est inférieure et retourne l’autre valeur si une entrée est NaN.

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

Calcule une estimation de (left * right) + addend.

INumberBase<IntPtr>.One

Obtient la valeur 1 pour le type.

INumberBase<IntPtr>.Radix

Obtient le radix, ou la base, pour le type.

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

Représente un entier signé où la largeur du bit est identique à un pointeur.

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

Représente un entier signé où la largeur du bit est identique à un pointeur.

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

Représente un entier signé où la largeur du bit est identique à un pointeur.

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

Tente de convertir une instance du type actuel en un autre type, lève une exception de dépassement de capacité pour toutes les valeurs qui se trouvent en dehors de la plage représentée du type actuel.

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

Tente de convertir une instance du type actuel en un autre type, en saturant toutes les valeurs qui se trouvent en dehors de la plage représentée du type actuel.

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

Tente de convertir une instance du type actuel en un autre type, en tronqué toutes les valeurs qui se trouvent en dehors de la plage représentée du type actuel.

INumberBase<IntPtr>.Zero

Obtient la valeur 0 pour le type.

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Remplit un objet SerializationInfo avec les données nécessaires pour sérialiser l’objet IntPtr actuel.

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

Déplace une valeur vers la gauche d’un montant donné.

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

Déplace une valeur à droite d’un montant donné.

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

Déplace une valeur à droite d’un montant donné.

ISignedNumber<IntPtr>.NegativeOne

Obtient la valeur -1 pour le type.

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

Soustrait deux valeurs pour calculer leur différence.

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

Soustrait deux valeurs pour calculer leur différence.

IUnaryNegationOperators<IntPtr,IntPtr>.CheckedUnaryNegation(IntPtr)

Calcule la négation unaire vérifiée d’une valeur.

IUnaryNegationOperators<IntPtr,IntPtr>.UnaryNegation(IntPtr)

Calcule la négation unaire d’une valeur.

IUnaryPlusOperators<IntPtr,IntPtr>.UnaryPlus(IntPtr)

Calcule le plus unaire d’une valeur.

S’applique à

Cohérence de thread

Ce type est thread safe.

Voir aussi