Zeiger (Informatik)



Mein Zeiger (auch englisch pointer ) wird in der Informatik ein spezifischer Wert, die Bedeutung einer Speicheradresse ist. Eine dieser Adressen kann unterschiedliche Daten, wie Variablen oder Objekte, aber auch Programmcodes ( Anweisungen ) enthalten. Durch Dereferenzierung des Zeiges ist es möglich, auf die Daten oder Code zuzugreifen.

Zeiger wurde sonst verwöhnt, von Speicher zu verdorben . So Wurde Bestimmt Datum Struktur, zum beispiel verkettete Liste , in der Regel mit Hilfe von Zeigern implementiert .

Einer ist ein Sonderfall und nur in Programmiersprachen, die die einzige Implementierung der Concept’s Reference sind .

Der Zeiger Wurde 1964/65 von Harold Lawson implementiert und implementiert PL / I.

Zeige in Programmiersprachen

Zeiger kommen vor Allem in maschinennahen Programmiersprachen Wie beispielsweise Assembler , C oder C ++ vor, während an den Gebrauch in string typisierten Sprachen Wie Modula-2 oder Ada stark einschränkt und sich in Sprachen Wie Java oder Eiffel Zwar internen vorhanden, aber für den Programmierer Vollständig Verborgen ( Opak ) Verstand. Mein Ersatz ist Sprachen ist es möglich, im Speicher zu erzeugen oder mit ihnen zu rechnen.

Manche Programmiersprachen Schrank der Gebrauch von Zeigern ein, Weil Programmierern bei der Arbeit mit Zeigern leicht schwerwiegende Programmierfehler unterlaufen . Bei Anwendungen, sterben in C oder C ++ geschrieben Ist, Stellen sie Haufe Ursache für Pufferüberläufe oder Speicherzugriffsverletzungen (SIGSEGVs) und daraus folgenden Absturz dar.

An der Stelle des Zeigers Option (C ++) oder Ausschließlich (Java, Python) stirbt Referenz, stirbt im Gegensatz zu Zeigern nicht ausdrücklich dereferenziert Wird Durcheinander in objektorientierten Sprachen auf.

In der Sprache C # oder Visual Basic .NET- Befehle Zeiger im Grunde nicht vor. Alle Funktionalitäten, die Zeiger Beetjes, Wurden durch Konzepte, die Delegate ersetzt. Sie sind in C #, nicht aber in VB.NET, aber Sie können den Code nicht finden Sie können sehen, wer in C ++ ist. [1] Damian kann in manchen Fällen bessere Leistung erreichen, wird auf Windows API- Funktionen zuzugriffen.

Typischer Zeiger

In den erfolgreichsten Programmen war Zeiger direkt mit Datentypen verbunden. So kann ein „Zeiger auf ein Objekt vom Typ Integer“ normalerweise Auch nur auf ein Objekt vom Typ „Integer“ verweisen. Es gibt einen Computertyp von Sehern, was bedeutet, dass es sich auch lohnt. In der ist Programmiersprache C stirbt Eine Voraussetzung zur Realisierung der Zeigerarithmetik (p. U.), Denn nur Durch das Wissen um sterben Speichergröße der assoziierten typen Kann sterben Adresse des Vorgänger- oder Nachfolgeelementes berechnet Werden. Darüber hinaus ermöglicht wer den Typischen Zeigern den Compiler , Verletzungen der Typkompatibilität zu.

Unyphyped Zeiger

This Zeigers sind mit keinem Datentyp verbunden. Sie können nicht dereferenziert, inkrementiert oder dekrementiert werden, um den Zugang zu einem bestimmten Zeigtyp werden zu können.

Beispiel dafur Ist den Typ void * in C und C ++, in Objective-C vom Typ ID oder POINTER in Pascal.

In der Hörprogrammierung gibt es so viele herausragende Zeiger.

Nullzeiger

Über diesen Ort gibt es nichts zu sagen, es gibt Orte wo Wert (sog. Nullwert , Cousin numerisch singt), wer weiß, kann dir nichts erzählen. Nullzeiger war in allen Worten verwöhnt worden, als Mann des Nullzeigers eine „Designierte Leerstelle“ kennzeichnet. Zum Beispiel wird eine einfach verkettete Liste so implementiert, dass das letzte Element auf dem Nullzeiger als ein Folgeelement. Ist Ihr Wissen über diesen Fall auch der Fall? In Pascal und Object Pascal heißt der Nullzeiger beispielweise nil(lateinisch: „nichts“ oder Akronym für „nicht in Liste“). In C kennzeichne das in der Standardbibliothek enthaltenPräprozessor- Makro NULLder Nullzeiger und verdeckt die interne Darstellung. In C ++ ist der Nullzeiger ebenfalls NULLund ist als Makro für diesen numerischen Null ( 0) definiert. [2] Ich bin kein C ++ – Standard C ++ 11 trug die Constant nullptrEingeführt, der Typische Unterscheidung zwischen 0 und dem Nullzeiger ermöglicht. Die Nullreferenz in Python hey None. Donald Knuth hat es Nullzeiger mein sie Symbol gegeben{\ displaystyle \ Lambda}dar, [3] this Konvention Wurde auch von dem Werkzeug Web und CWEB (ebenda) used.

Das Dereferenzieren eines Nullzeigers ist meist nicht erlaubt. Sie können sich gerne für ein Programm bewerben, und Sie erhalten eine Kopie des Programms. Schutzverletzung .

Uninitialisierter Zeiger

Stürze Einer Zeigervariable dereferenziert Wird, stirbt nicht Auf einen gelben Speicherbereich Dezember entsprechend typ Zeigt, Kann es ebenfalls zu unerwarteten verhalten kommen. So kann Eine Situation, WENN Eine Variable vor ihrer benutzung nicht Auf einem gelben Wert initialisiert Wird oder , ideal für noch Auf eine Speicheradresse verweist, stirbt nicht mehr gelb ist (auftreten wilder Zeiger ). Sagt der Suchende, kein guter Sprachsprecher, Sie können möglicherweise keine Nachricht senden .

Zeigeroperationen

Dereferenzieren
Auf das Objekt, auf Segel der Zuger, zugreifen. Im Falle eines Funktionszeigers zB die Referenzfunktion Funktion aufrufen
Inkrementieren / Dekrementieren
Es sieht auf das Objekt versetzen, das sich im Speicher befindet / vor dem derzeitigen Objekt befindet. Intern wird dies durch Addition oder Subtraktion der Objektgröße realisiert. Dies ist der Compiler nur, wenn der Typ der Referenzobjekte der Kompilierzeit klar ist.
Zerstören
Das Referenzobjekt ist aufgelistet (siehe Konstruktor / Destruktor ). Dies ist der Fall der Destruktoren, aller Variablen, die versuchen, ein Teil der Objekte zu sein, die zum Wesen des Universums gehören. Dies ist im Allgemeinen nicht möglich.
Vergleich
meine anderen Zeigern auf Gleichheit / Ungleichheit. Manche Sprachen erlauben auch einen Größeren-Kleiner-Vergleich Zwischen Zeigern.

Zeigerarithmetik

Das Erhohen oder Verringen eines Zeiges um einen bestimmten Wert oder das Subtrahieren zweier Zeiger wird als Zeigerarithmetik bezeichnet.

Da diese Operationen sehr fehleranfällig sind, sind sie in der Programmiersprache meist nicht unterstützt, was auch wiederrum andere Methoden sind, die die gleiche Funktionalität zu implementieren.

Im Besitz von Zeigern auf Daten

Vorteile

Die Nutzung von Zeigern kann im Falle von Fällen das Programm Tablet oder Helfen Speicherplatz zu Sparen speichern:

  • Ist der Programm-Speicher unbekannt, so kann der Speicher automatisch angepasst werden ( Dynamic Speicherverwaltung ).
  • Sie sind nicht willkommen, aber Sie sind nicht erwünscht.
  • Bei der verwendung von Feldern BZW. Vektoren können Mittel Zeigern Schnell in der Mitte des Feldes springen und navigieren. Anstätt EIN Index zu Verwenden und stirbt so Feldelemente daruber anzusprechen, setzt man zu Beginn des Ablauf EINEN Zeiger auf den Anfang des Feldes und inkrementieren Diesen Zeiger bei Jedem durchlauf. Die Tatsa- chische Schrittweite des Inkrements konzentriert sich auf den verwandten Datentyp. This Art des Zugriffs auf Felder wird in denelen Programming und Compilern en manes intern automatisch so umgesetzt.
  • Verweise auf Speicherbereiche können geändert werden, z. B. zur Sortierung von Listen , ohne de Elemente kopieren zu müssen ( Dynamic Data Structures ).
  • Bei Funktionsaufrufen Können Durch Die Übergabe Eines Zeiger auf ein Objekt vermieden Werden, selbst zu übergeben das Objekt, war Ein in Bestimmt Fall sehr zeitaufwendige Anfertigung Einer Kopie der Objekte erfordern Würde ( Referenzparameter ).
  • Anstehendes Variablen Mal zu kopieren und so etwas wie ein neuer Speicherplatz zur Verfügung zu stellen, kann man in verschiedenen Fällen einfach mehrere Variable aufwaschen.
  • Bei Zeichenketten können Sie die Speicherinhalte ändern, ohne über Objekte und Funktionen gehen zu müssen.

Nachteile und Gefahren

Es gibt Sprachen, die bewusst den Einsatz von Zeigern beschwören (s. O.). Das ist Hass, unser Großvater Gründe:

  • Meine Zeiger werden genauer betrachtet, kompliziert und fehleranfällig. Wir denken immer an das Programm, die Programmieranfängern bereiten oft Schwierigkeiten vor. Auch bei erfahrenen Programmierern kann es passieren, dass der Fehler im Verhältnis zu Zeigern oder relativ üblich ist.
  • In MANCHEM Programmiersprachen sind keinen effektiver Datentyp -Kontrolle Möglich, das heißt, beim ausführen can not Kontrolliert Werden, Welche Daten an der Zieladresse Stehen, und ob die Erwartungen (SPEZIFIKATIONEN) this dem Programmablauf entsprechenden
  • Programmierfehler bei der Arbeit mit Zeigern can schweren Folgen HABEN. So kommt es z. B. zu Programmabstürzen, unbemerkte Beschädigung von Daten (Durch vagabundierende Zeiger) Pufferüberläufe oder „verlorene“ Speicherbereiche ( Speicherlecks ): Das Programm Fördert Ständig mehr Speicher ein, die Ande Anwendungen nicht mehr zur verfügung STAND, bis im Extremfall des Betriebssystem nicht mehr Genügend Kann liefern.
  • Setzen sich seit Struktur aus Zeigern zusammen, sterben auf einzelnen kleine Speicherblöcke verweisen, Kann stirbt insbesondere bei Prozess, sterben sehr lange laufen, zur Fragmentierung Dezember Adressraumes Führen, so that der Prozess Keinen weitere Speicher anfordern Kann, obwohl sterben Summe der allozierten Speicherblöcke wesentlich Geringer als Der überstreichbare Speicher ist.
  • Die Effizienz des Prozessor-Caches führte den Darunter, der die Datenstruktur auf viele Speicherblöcke gewann, der den Adressraum ablehnt. Daher kann es böse sein, Statdtessen Tabelle bzw. Felder (engl.: Array ) zu verwenden, weil diese eine kompakte Darstellung im Speicher haben.
  • Letzteres mag in meiner Beziehung zu meinem Paging negativ sein.
  • Nicht zuletzt ist ein Zeiger Eine Typische Ansatzstelle von Malware : Das Schadprogramm braucht Nur eine Stelle zu ÄNDERN, um auf den Eigenen Programm – Code zu zeigen: Gibt es keine saubere Kontrolle des für das Programm reservierten Speicherbereichs, Kanns of this Auch Beliebers Anderswo Liegen. Außerdem sind sie auch falsch Pufferbeutelläufe einfach zu erzeugen. Inbound können zB Datenvariablen programmierte zur Ausführung. Dies stellt eine typische Methode zur Erstinfektion dar.

Intelligenter Zeiger

Als Intelligent Zeigher ( Smart Pointer ) wurden Objekte erstellt, die einfach und leicht zu bedienen sind, sowie die Funktionen und Funktionen von ausstatten. Z. B. Könnte ein „intelligenter Zeiger“ ein dynamisch alloziertes Speicherobjekt freigeben, so wird die letzte Referenz ausgeführt.

Zeiger Auf einem COM – oder CORBA – Schnittstelle Ist in Manchen Programmiersprachen (. Z B. Object Pascal ) als intelligenter Zeiger implementiert.

Funktionssucher (Methodenzeiger)

Funktionelles Zuschauerbild und spezielle Klasse von Zeigern. Sie können kein Datensegment erreichen, ohne den einzelnen Funktionspunkt im Segment „Speichercodes“. Damit ist es möglich, verwerteter Functional Officer, der für die Zukunft der Arbeit verantwortlich ist. Funktionszeiger kommen Haufe in verbindung Mit Rückruffunktionen (Callback – Funktion) zum Einsatz und Stellen Einer Formular der SPAT Bindung dar.

Siehe auch : Methodenzeiger

Memberzeiger

In C ++ ist es möglich, analog zu Metodenzeigern auch auf die Daten zu verzichten:

struct RGB_Pixel {
 unsigned char rot , grün , blau ;
};
// definiert "Channel" als Type Alias ​​für "Seen to"
unsigned char "-Datenelement der Klasse RGB_Pixel": typedef unsigned char RGB_Pixel :: * Channel ;
// invertiert den ausgewählten RGB - Kanal große Pixel Eines Bilde
Leere Invertzucker ( std :: vector < RGB_Pixel > & Bild , Channel - Kanal ) {
 für ( RGB_Pixel & Pixel : Bild ) {
 Pixel . * Kanal = 255 - Pixel . * Kanal ;
 }
}
int main ()
{
 std :: vektor < RGB_Pixel > image = ...
 Kanal g = & RGB_Pixel :: grün ; // "Memberzeiger" betrachtet den grauen RGB-Kanal
 invertiert ( Bild , g ); // nur der grüne RGB-Kanal invertiert
}

Siehe auch

  • Segel in C

Weblinks

 Commons: Zeiger (Informatik) – Sammlung von Bildern, Videos und Audiodateien
  • Sieht in C ++ aus
  • Segel in C #

Einzelstunden

  1. Hochspringen↑ MSDN über den Code und Zeiger in C #
  2. Hochspringen↑ Bjarne Stroustrup : C ++ Stil und Technik FAQ
  3. Hochspringen↑ Donald Knuth: Grundlegende Algorithmen (=  Die Kunst der Computerprogrammierung ). 3. Auflage. Addison Wesley, 1997, ISBN 0-201-89683-4 , S. 234.