Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

IntPtr-Struktur

 

Veröffentlicht: Oktober 2016

Ein plattformabhängiger Typ zur Darstellung von Zeigern und Handles.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public value struct IntPtr : ISerializable

NameBeschreibung
System_CAPS_pubmethodIntPtr(Int32)

Initialisiert eine neue Instanz von IntPtr mit dem angegebenen 32-Bit-Zeiger bzw. -Handle.

System_CAPS_pubmethodIntPtr(Int64)

Initialisiert eine neue Instanz von IntPtr mit einem 64-Bit-Zeiger oder -Handle.

System_CAPS_pubmethodIntPtr(Void*)

Initialisiert eine neue Instanz von IntPtr mit dem angegebenen Zeiger auf einen nicht angegebenen Typ.

NameBeschreibung
System_CAPS_pubpropertySystem_CAPS_staticSize

Ruft die Größe dieser Instanz ab.

NameBeschreibung
System_CAPS_pubmethodSystem_CAPS_staticAdd(IntPtr, Int32)

Addiert einen Offset zum Wert eines Zeigers.

System_CAPS_pubmethodEquals(Object^)

Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.(Überschreibt ValueType::Equals(Object^).)

System_CAPS_pubmethodGetHashCode()

Gibt den Hashcode für diese Instanz zurück.(Überschreibt ValueType::GetHashCode().)

System_CAPS_pubmethodGetType()

Ruft den Type der aktuellen Instanz ab.(Geerbt von „Object“.)

System_CAPS_pubmethodSystem_CAPS_staticSubtract(IntPtr, Int32)

Subtrahiert einen Offset vom Wert eines Zeigers.

System_CAPS_pubmethodToInt32()

Konvertiert den Wert dieser Instanz in eine 32-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_pubmethodToInt64()

Konvertiert den Wert dieser Instanz in eine 64-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_pubmethodToPointer()

Konvertiert den Wert dieser Instanz in einen Zeiger auf einen nicht angegebenen Typ.

System_CAPS_pubmethodToString()

Konvertiert den numerischen Wert des aktuellen IntPtr-Objekts in die entsprechende Zeichenfolgendarstellung.(Überschreibt ValueType::ToString().)

System_CAPS_pubmethodToString(String^)

Konvertiert den numerischen Wert des aktuellen IntPtr-Objekts in die entsprechende Zeichenfolgendarstellung.

NameBeschreibung
System_CAPS_pubfieldSystem_CAPS_staticZero

Ein schreibgeschütztes Feld, das einen mit 0 (null) initialisierten Zeiger oder ein Handle darstellt.

NameBeschreibung
System_CAPS_puboperatorSystem_CAPS_staticAddition(IntPtr, Int32)

Addiert einen Offset zum Wert eines Zeigers.

System_CAPS_puboperatorSystem_CAPS_staticEquality(IntPtr, IntPtr)

Bestimmt, ob zwei angegebene Instanzen von IntPtr gleich sind.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Int32 to IntPtr)

Konvertiert den Wert einer 32-Bit-Ganzzahl mit Vorzeichen in einen IntPtr-Konstruktor.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Int64 to IntPtr)

Konvertiert den Wert einer 64-Bit-Ganzzahl mit Vorzeichen in einen IntPtr-Konstruktor.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Int32)

Konvertiert den Wert des angegebenen IntPtr-Konstruktors in eine 32-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Int64)

Konvertiert den Wert des angegebenen IntPtr-Konstruktors in eine 64-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Void*)

Konvertiert den Wert des angegebenen IntPtr in einen Zeiger auf einen nicht angegebenen Typ.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Void* to IntPtr)

Konvertiert den angegebenen Zeiger auf einen nicht angegebenen Typ in einen IntPtr.

System_CAPS_puboperatorSystem_CAPS_staticInequality(IntPtr, IntPtr)

Bestimmt, ob zwei angegebene Instanzen von IntPtr nicht gleich sind.

System_CAPS_puboperatorSystem_CAPS_staticSubtraction(IntPtr, Int32)

Subtrahiert einen Offset vom Wert eines Zeigers.

NameBeschreibung
System_CAPS_pubinterfaceSystem_CAPS_privmethodISerializable::GetObjectData(SerializationInfo^, StreamingContext)

Füllt ein SerializationInfo-Objekt mit den für das Serialisieren des aktuellen IntPtr-Objekts erforderlichen Daten.

Die IntPtr ist eine ganze Zahl sein, dessen Größe plattformspezifisch ist, ausgelegt. D. h. muss eine Instanz dieses Typs werden 32-Bit unter 32-Bit-Hardware und Betriebssystemen und 64-Bit unter 64-Bit-Hardware und Betriebssystemen.

Die IntPtr -Typ kann von Sprachen, die Zeiger unterstützen, und als allgemeine Mittel zum Verweisen auf Daten zwischen Sprachen, die und unterstützen keine Zeiger verwendet werden.

IntPtrObjekte können auch verwendet werden, um Handles zu speichern. Z. B. Instanzen von IntPtr umfassenden dienen der System.IO::FileStream Klasse zum Halten von Dateihandles.

Die IntPtr Typ CLS-kompatibel ist während der UIntPtr ist keine. Nur die IntPtr Typ wird in der common Language Runtime verwendet. Die UIntPtr Typ dient hauptsächlich architektonische Einheitlichkeit mit verwalten die IntPtr Typ.

Dieser Typ implementiert die ISerializable Schnittstelle.

Im folgenden Beispiel wird verwaltete Zeiger, der Zeichen in einem Array Reihenfolge umgekehrt werden soll. Nachdem er initialisiert ein String -Objekt und ruft seine Länge wird Folgendes:

  1. Ruft die Marshal::StringToHGlobalAnsi Methode, um die Unicode-Zeichenfolge in nicht verwalteten Speicher als ANSI-Zeichen (Einzelbyte) zu kopieren. Die Methode gibt ein IntPtr Objekt, das an den Anfang der nicht verwalteten Zeichenfolge verweist. Visual Basic-Beispiel verwendet die this-Zeiger direkt. in C++ und c#-Beispielen wird er in einen Zeiger auf ein Byte umgewandelt.

  2. Ruft die Marshal::AllocHGlobal Methode, um die gleiche Anzahl von Bytes Belegen wie die nicht verwaltete Zeichenfolge belegt. Die Methode gibt ein IntPtr -Objekt, das an den Anfang des nicht verwalteten Speicherblocks zeigt. Visual Basic-Beispiel verwendet die this-Zeiger direkt. in C++ und c#-Beispielen wird er in einen Zeiger auf ein Byte umgewandelt.

  3. Visual Basic-Beispiel definiert eine Variable namens offset , ist gleich der Länge der ANSI-Zeichenfolge. Es wird verwendet, um den Offset in den nicht verwalteten Arbeitsspeicher zu bestimmen, in die nächste Charta in der ANSI-Zeichenfolge kopiert werden. Da Startwert die Länge der Zeichenfolge ist, wird der Kopiervorgang ein Zeichen vom Anfang der Zeichenfolge bis zum Ende des Speicherblocks kopieren.

    Der C#- und C++-Beispiele-Aufruf die ToPointer Methode, um ein nicht verwalteter Zeiger auf die Startadresse der Zeichenfolge und den nicht verwalteten Speicherblock abzurufen und sie fügen einen kleiner als die Länge der Zeichenfolge, die die Startadresse der ANSI-Zeichenfolge. Da der nicht verwalteten Zeichenfolgenzeiger nun bis zum Ende der Zeichenfolge verweist, wird der Kopiervorgang ein Zeichen vom Ende der Zeichenfolge am Anfang der Speicherblock kopieren.

  4. Mithilfe einer Schleife um jedes Zeichen aus der Zeichenfolge in den nicht verwalteten Speicherblock zu kopieren.

    Im Visual Basic-Beispiel wird die Marshal::ReadByte(IntPtr, Int32) Methode, um die Byte (oder ein-Byte-Zeichen) an einem angegebenen Offset aus dem verwalteten Zeiger auf die ANSI-Zeichenfolge zu lesen. Der Offset wird bei jeder Iteration der Schleife erhöht. Er ruft dann die Marshal::WriteByte(IntPtr, Int32, Byte) Methode zum Schreiben von Bytes auf die Speicheradresse, die durch die Startadresse des plus nicht verwalteten Speicherblock definierten offset. Es wird dann verringert offset.

    Die C#- und C++-Beispiele Ausführen des Kopiervorgangs, verringern den Zeiger auf die Adresse von der nächsten Position in der nicht verwalteten ANSI-Zeichenfolge und erhöhen den Zeiger auf die nächste Adresse im nicht verwalteten Block.

  5. Alle Beispiele rufen die Marshal::PtrToStringAnsi den nicht verwaltete Speicherblock mit der kopierten ANSI-Zeichenfolge in einen verwalteten Unicode konvertiert String Objekt.

  6. Rufen Sie nach dem Anzeigen von Verbindungszeichenfolgen für die ursprüngliche und umgekehrten alle Beispiele für die FreeHGlobal Methode, um den für den nicht verwalteten ANSI-Zeichenfolge und den nicht verwalteten Speicherblock belegten Arbeitsspeicher freizugeben.

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

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Dieser Typ ist threadsicher.

Zurück zum Anfang
Anzeigen: