Udostępnij za pośrednictwem


IntPtr.ToPointer Metoda

Definicja

Ważne

Ten interfejs API nie jest zgodny ze specyfikacją CLS.

Konwertuje wartość tego wystąpienia na wskaźnik do nieokreślonego typu.

public:
 void* ToPointer();
[System.CLSCompliant(false)]
public void* ToPointer ();
[<System.CLSCompliant(false)>]
member this.ToPointer : unit -> nativeptr<unit>

Zwraca

Void*

Wskaźnik do Void; oznacza to wskaźnik do pamięci zawierającej dane nieokreślonego typu.

Atrybuty

Przykłady

W poniższym przykładzie użyto zarządzanych wskaźników, aby odwrócić znaki w tablicy. Po zainicjowaniu String obiektu i jego długości wykonuje następujące czynności:

  • Wywołuje metodę w Marshal.StringToHGlobalAnsi celu skopiowania ciągu Unicode do niezarządzanej pamięci jako znaków ANSI (jeden bajt). Metoda zwraca IntPtr obiekt wskazujący początek niezarządzanego ciągu.

  • Wywołuje metodę Marshal.AllocHGlobal w celu przydzielenia tej samej liczby bajtów co niezarządzany ciąg zajmuje. Metoda zwraca IntPtr obiekt wskazujący początek niezarządzanego bloku pamięci.

  • Wywołuje metodę ToPointer , aby uzyskać niezarządzany wskaźnik do adresu początkowego ciągu i niezarządzanego bloku pamięci, a następnie dodaje jedną mniejszą niż długość ciągu do adresu początkowego ciągu ANSI. Ponieważ niezarządzany wskaźnik ciągu wskazuje teraz koniec ciągu, operacja kopiowania skopiuje znak z końca ciągu na początek bloku pamięci.

  • Używa pętli do kopiowania każdego znaku z ciągu do niezarządzanego bloku pamięci. Po każdej operacji kopiowania dekrementuje wskaźnik do adresu następnej lokalizacji w niezarządzanym ciągu ANSI i zwiększa wskaźnik do następnego adresu w bloku niezarządzanym.

  • Wywołuje metodę Marshal.PtrToStringAnsi , aby przekonwertować niezarządzany blok pamięci zawierający skopiowany ciąg ANSI do zarządzanego obiektu Unicode String .

  • Po wyświetleniu oryginalnych i odwróconych ciągów wywołuje metodę Marshal.FreeHGlobal , aby zwolnić pamięć przydzieloną dla niezarządzanego ciągu ANSI i niezarządzanego bloku pamięci.

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

Dotyczy