www.wikidata.de-de.nina.az
Mit Zeiger englisch pointer wird in der Informatik ein Objekt einer Programmiersprache bezeichnet das eine Speicheradresse zwischenspeichert Der Zeiger a zeigt auf Variable b Die Variable b enthalt eine Nummer binar 01101101 und die Variable a enthalt die Speicheradresse von b hexadezimal 1008 In diesem Fall passen die Adresse und die Daten in ein 32 Bit Wort source source source source source source Video Tutorial uber Zeiger Dereferenzierung Felder und Zeigerarithmetik sowie deren Funktionsweise im Arbeitsspeicher am Beispiel der Programmiersprache CDer Zeiger referenziert verweist zeigt auf einen Ort im Hauptspeicher des Computers Hier konnen Variablen Objekte oder Programmanweisungen gespeichert sein Das Erlangen der dort hinterlegten Daten wird als dereferenzieren oder ruckverweisen bezeichnet siehe Zeigeroperationen Ein Zeiger ist ein Sonderfall und in einigen Programmiersprachen die einzige Implementierungsmoglichkeit des Konzepts einer Referenz Zeiger werden in diesem Sinne auch als Referenzvariable bezeichnet Zeiger werden unter anderem dazu verwendet den dynamischen Speicher zu verwalten So werden bestimmte Datenstrukturen zum Beispiel verkettete Listen in der Regel mit Hilfe von Zeigern implementiert Der Zeiger wurde 1964 65 von Harold Lawson eingefuhrt und in der Programmiersprache PL I implementiert Inhaltsverzeichnis 1 Zeiger in Programmiersprachen 1 1 Zeiger in C 2 Typisierung 3 Sonderfalle 3 1 Nullzeiger 3 2 Ungultige Zeiger 3 3 Intelligente Zeiger 3 4 Funktionszeiger Methodenzeiger 3 5 Memberzeiger 4 Zeigeroperationen 5 Zeigerarithmetik 5 1 Zeiger auf Arrays 6 Eigenschaften von Zeigern auf Daten 6 1 Vorteile 6 2 Nachteile und Gefahren 7 Weblinks 8 EinzelnachweiseZeiger in Programmiersprachen BearbeitenSiehe auch Zeiger C Zeiger kommen vor allem in maschinennahen Programmiersprachen wie Assembler oder in Sprachen die zur Systemprogrammierung geeignet sind wie C oder C vor Der Gebrauch in streng typisierten Sprachen wie Modula 2 oder Ada ist stark eingeschrankt und in Sprachen wie Java oder Eiffel zwar intern vorhanden aber fur den Programmierer verborgen opak Mit erstgenannten Sprachen ist es moglich Zeiger auf beliebige Stellen im Speicher zu erzeugen oder mit ihnen zu rechnen Manche Programmiersprachen schranken den Gebrauch von Zeigern ein weil Programmierern bei der Arbeit mit Zeigern leicht schwerwiegende Programmierfehler unterlaufen Bei Programmen die in C oder C geschrieben sind stellen sie haufige Ursachen fur Pufferuberlaufe oder Speicherzugriffsverletzungen und daraus folgende Absturze oder Sicherheitslucken dar 1 In objektorientierten Sprachen tritt an die Stelle der Zeiger alternativ C oder ausschliesslich Java Python die Referenz die im Gegensatz zu Zeigern nicht ausdrucklich dereferenziert werden muss Zeiger in C Bearbeiten In der Sprache C oder Visual Basic NET kommen Zeiger im Grunde nicht vor Alle Funktionalitaten die Zeiger bieten wurden durch Konzepte wie Delegate ersetzt Es ist jedoch in C nicht aber in VB NET moglich unsicheren Code zu deklarieren der auch speziell kompiliert werden muss um Zeiger wie in C nutzen zu konnen 2 Damit kann in manchen Fallen bessere Leistung erreicht werden oder es wird moglich auf die Windows API Funktionen zuzugreifen Der Datentyp auf den ein Zeiger verweist wird als Verweistyp bezeichnet Zeigertypen konnen nur innerhalb eines Blocks hinter dem Schlusselwort unsafe verwendet werden Nur bestimmte Datentypen namlich elementare Datentypen Aufzahlungstypen Zeigertypen und Strukturtypen konnen ein Verweistyp sein Es ist moglich Konvertierungen zwischen verschiedenen Zeigertypen sowie zwischen Zeigertypen und ganzzahligen Datentypen durchzufuhren Typisierung BearbeitenDie Typisierung eines Zeigers sagt aus ob der Datentyp des Zeigers selbst Auskunft uber den Datentyp des Wertes auf den der Zeiger verweist gibt Es wird zwischen typisierten und untypisierten Zeigern unterschieden 3 Typisierte Zeiger konnen nur auf Werte des entsprechenden Datentyps verweisen So kann ein Zeiger auf ein Wert vom Typ Integer auch nur auf ein Wert vom Typ Integer verweisen Der Datentyp des Zeigers selbst bestimmt sich also durch den Datentyp auf den er verweist In der Programmiersprache C ist dies eine Voraussetzung zur Realisierung der Zeigerarithmetik s u denn nur durch das Wissen um die Speichergrosse des assoziierten Typs kann die Adresse des Vorganger oder Nachfolgeelementes berechnet werden 3 Daruber hinaus ermoglicht die Typisierung von Zeigern dem Compiler Verletzungen der Typkompatibilitat zu erkennen 4 Untypisierte Zeiger konnen nicht dereferenziert inkrementiert oder dekrementiert werden sondern mussen vor dem Zugriff in einen typisierten Zeigertyp umgewandelt werden Beispiele dafur sind der Typ void in C C und D in Objective C vom Typ id oder POINTER in Pascal In hoheren Programmiersprachen existieren zum Teil keine untypisierten Zeiger 3 Sonderfalle BearbeitenNullzeiger Bearbeiten Der Nullzeiger ist ein spezieller Wert ein sog Nullwert nicht zwingend numerisch 0 Wird dieser Wert einer programmiersprachlich als Zeiger deklarierten Variablen zugewiesen zeigt dies an dass mit der Zeigervariablen auf nichts verwiesen wird Nullzeiger werden in fast allen Programmiersprachen sehr gerne verwendet um eine designierte Leerstelle zu kennzeichnen Eine Ausnahme ist die Programmiersprache Rust 5 Zum Beispiel wird eine einfach verkettete Liste meist so implementiert dass dem Folgezeiger des letzten Elements der Wert des Nullzeigers gegeben wird um auszudrucken dass es kein weiteres Element gibt Auf diese Weise lasst sich ein zusatzliches Feld das das Ende der Liste zu bedeuten hatte einsparen In Pascal und Object Pascal heisst der Nullzeiger beispielsweise nil lateinisch nichts oder Akronym fur not in list In C kennzeichnet das in der Standardbibliothek enthaltene Praprozessor Makro NULL den Nullzeiger und verdeckt die interne Reprasentation In C heisst der Nullzeiger ebenfalls NULL und ist als Makro fur die numerische Null 0 definiert 6 Im neuen C Standard C 11 wurde die Konstante nullptr eingefuhrt die eine typsichere Unterscheidung zwischen 0 und dem Nullzeiger ermoglicht Donald Knuth stellt den Nullzeiger mit dem Symbol L displaystyle Lambda nbsp dar 7 diese Konvention wird auch von den Werkzeugen WEB und CWEB ebenda verwendet Das Dereferenzieren eines Nullzeigers ist meist nicht erlaubt Je nach Programmiersprache und Betriebssystem fuhrt es zu undefiniertem Verhalten oder einem Programmabbruch per Ausnahmebehandlung englisch exception bzw Schutzverletzung Ungultige Zeiger Bearbeiten Falls eine Zeigervariable dereferenziert wird die nicht auf einen gultigen Speicherbereich des entsprechenden Typs zeigt kann es ebenfalls zu unerwartetem Verhalten kommen So kann eine Situation auftreten wenn eine Variable vor ihrer Benutzung nicht auf einen gultigen Wert initialisiert wurde uninitialisierter Zeiger oder wenn sie noch auf eine Speicheradresse verweist die nicht mehr gultig ist wilder Zeiger Zeigt der Zeiger nicht auf eine gultige Speicheradresse kann es wie beim Nullzeiger zu einer Schutzverletzung kommen Intelligente Zeiger Bearbeiten Hauptartikel Intelligenter Zeiger Als Intelligente Zeiger engl smart pointers werden Objekte bezeichnet die einfache Zeiger einkapseln und mit zusatzlichen Funktionen und Eigenschaften ausstatten Z B konnte ein smart pointer ein dynamisch alloziertes Speicherobjekt freigeben sobald die letzte Referenz darauf geloscht wird Zeiger auf eine COM oder CORBA Schnittstelle sind in manchen Programmiersprachen z B Object Pascal als Intelligenter Zeiger implementiert Funktionszeiger Methodenzeiger Bearbeiten Funktionszeiger bilden eine besondere Klasse von Zeigern Sie zeigen nicht auf einen Bereich im Datensegment sondern auf den Einsprungspunkt einer Funktion im Codesegment des Speichers Damit ist es moglich benutzerdefinierte Funktionsaufrufe deren Ziel erst zur Laufzeit bestimmt wird zu realisieren Funktionszeiger kommen haufig in Verbindung mit Ruckruffunktionen callback function zum Einsatz und stellen eine Form der spaten Bindung dar Siehe auch Methodenzeiger Memberzeiger Bearbeiten In C ist es moglich analog zu Methodenzeigern auch Zeiger auf die Datenmember einer Klasse zu definieren include lt cstdint gt include lt vector gt using namespace std struct RGB Pixel uint8 t red 0 green 0 blue 128 definiert Typalias Channel als Zeiger auf uint8 t Datenmember der Klasse RGB Pixel using Channel uint8 t RGB Pixel invertiert den ausgewahlten RGB Kanal aller Pixel eines Bildes void invert vector lt RGB Pixel gt amp image Channel channel for RGB Pixel amp pixel image pixel channel 255 pixel channel int main vector lt RGB Pixel gt image Memberzeiger zeigt auf den grunen RGB Kanal Channel green amp RGB Pixel green nur der grune RGB Kanal wird invertiert invert image green Zeigeroperationen BearbeitenDereferenzieren auf das Objekt auf welches der Zeiger zeigt zugreifen Im Falle eines Funktionszeigers z B die referenzierte Funktion aufrufen Inkrementieren Dekrementieren den Zeiger auf das Objekt versetzen das sich im Speicher hinter vor dem derzeitigen Objekt befindet Intern wird dies durch Addition oder Subtraktion der Objektgrosse realisiert Diese ist dem Compiler nur bekannt wenn der Typ des referenzierten Objekts wahrend der Kompilierzeit klar gekennzeichnet ist Zerstoren des referenzierten Objektes siehe Konstruktor Destruktor Es bietet sich nach Aufruf des Destruktors an alle Variablen die Zeiger auf das zerstorte Objekt enthalten auf den Nullwert zu setzen um spater erkennen zu konnen dass kein gultiges Objekt mehr referenziert wird Dies ist im Allgemeinen jedoch nicht moglich Vergleichen mit anderen Zeigern auf Gleichheit Ungleichheit Manche Sprachen erlauben auch einen Grosser Kleiner Vergleich zwischen Zeigern Zeigerarithmetik BearbeitenDas Rechnen mit Zeigern auf Basis der Speichergrosse des referenzierten Typs wird als Zeigerarithmetik bezeichnet Dabei konnen Zeiger erhoht verringert und subtrahiert werden Alle Operationen berucksichtigen dabei die Grosse des referenzierten Typs Inkrementiert man beispielsweise den Zeiger auf einen vier Byte grossen Datentyp um eins so wird dessen Wert also die Speicheradresse um vier Bytes erhoht Beim Subtrahieren zweier Zeiger erhalt man die Anzahl dazwischen passender Objekte des referenzierten Typs In Sprachen wie C wird die Zeigerarithmetik ublicherweise eingesetzt um uber terminierte Arrays zu iterieren wie in folgendem Programm das uber das Array seiner Argumente iteriert include lt stdio h gt int main int argc char argv argv ist NULL terminiert char cpp for cpp argv cpp cpp cpp wird jeweils um die Grosse von char erhoht printf arg s adr p n cpp cpp dereferenzierter Wert und seine Adresse printf args lu n cpp argv Anzahl der Elemente im Array return 0 Der Aufruf mit Ausgabe sieht auf einem 64 Bit System beispielsweise so aus b foo bar arg b adr 0x7fffffffea00 arg foo adr 0x7fffffffea08 arg bar adr 0x7fffffffea10 args 3 Da Zeigerarithmetik als fehleranfallig angesehen wird wird sie in hoheren Programmiersprachen meist nicht unterstutzt wobei dort andere Moglichkeiten gegeben sind um die gleiche Funktionalitat zu erlangen Zeiger auf Arrays Bearbeiten Man kann in C und C einer Zeigervariablen direkt ein Array zuweisen Das Ergebnis ist dass der Zeiger auf das erste Element des Arrays zeigt int triangleNumbers 5 int numbersPointer triangleNumbers Uber diese Zeigervariablen kann man uber den Index Operator auf die einzelnen Elemente des Arrays zugreifen numbersPointer 0 0 numbersPointer 1 1 numbersPointer 2 3 numbersPointer 3 6 numbersPointer 4 10 cout lt lt numbersPointer lt lt endl cout lt lt numbersPointer 3 lt lt endl In diesem Beispiel werden den Elementen des Array die ersten funf Dreieckszahlen zugewiesen Mit der vorletzten Anweisung wird der Inhalt des ersten Elements des Arrays also 0 ausgegeben Mit der letzten Anweisung wird der Inhalt des Array Elements mit dem Index 3 also 6 ausgegeben Eigenschaften von Zeigern auf Daten BearbeitenVorteile Bearbeiten Die Verwendung von Zeigern kann in bestimmten Fallen den Programmablauf beschleunigen oder helfen Speicherplatz zu sparen Ist die von einem Programm im Speicher zu haltende Datenmenge am Programmstart unbekannt so kann genau so viel Speicher angefordert werden wie benotigt wird Dynamische Speicherverwaltung Es ist moglich wahrend des Programmablaufs nicht mehr benotigten Speicher wieder an das Betriebssystem zuruckzugeben Bei der Verwendung von Feldern bzw Vektoren kann man mittels Zeigern schnell innerhalb des Feldes springen und navigieren Anstatt einen Index zu verwenden und so die Feldelemente daruber anzusprechen setzt man zu Beginn des Ablaufs einen Zeiger auf den Anfang des Feldes und inkrementiert diesen Zeiger bei jedem Durchlauf Die tatsachliche Schrittweite des Inkrements richtet sich nach dem betreffenden Datentyp Diese Art des Zugriffs auf Felder wird in vielen Programmiersprachen und Compilern an manchen Stellen intern automatisch so umgesetzt Verweise auf Speicherbereiche konnen geandert werden z B zur Sortierung von Listen ohne die Elemente umkopieren zu mussen dynamische Datenstrukturen Bei Funktionsaufrufen kann durch die Ubergabe eines Zeigers auf ein Objekt vermieden werden das Objekt selbst zu ubergeben was eine in bestimmten Fallen sehr zeitaufwendige Anfertigung einer Kopie des Objektes erfordern wurde Referenzparameter Anstatt Variablen jedes Mal zu kopieren und so jedes Mal erneut Speicherplatz zur Verfugung zu stellen kann man in manchen Fallen einfach mehrere Zeiger auf dieselbe Variable verweisen lassen Bei Zeichenketten konnen direkt Speicherinhalte angesprochen werden ohne uber Objekte und Funktionen gehen zu mussen Nachteile und Gefahren Bearbeiten Es gibt Sprachen die bewusst auf den Einsatz von Zeigern verzichten s o Dies hat vor allem folgende Grunde Der Umgang mit Zeigern ist schwierig zu erlernen kompliziert und fehleranfallig Vor allem im Sinne von Zeigern zu denken bereitet Programmieranfangern oft Schwierigkeiten Auch bei erfahrenen Programmierern kommen Fluchtigkeitsfehler im Umgang mit Zeigern noch relativ haufig vor In manchen Programmiersprachen ist keine effektive Datentyp Kontrolle moglich das heisst beim Ausfuhren kann nicht kontrolliert werden welche Daten an der Zieladresse stehen und ob diese den Erwartungen Spezifikationen des Programmablaufs entsprechen Programmierfehler bei der Arbeit mit Zeigern konnen schwere Folgen haben So kommt es z B zu Programmabsturzen unbemerkter Beschadigung von Daten durch vagabundierende Zeiger Pufferuberlaufen oder verlorenen Speicherbereichen Speicherlecks Das Programm fordert standig mehr Speicher an der anderen Programmen nicht mehr zur Verfugung steht bis im Extremfall das Betriebssystem nicht mehr genugend liefern kann Setzen sich Datenstrukturen aus Zeigern zusammen die auf einzelne kleine Speicherblocke verweisen kann dies insbesondere bei Prozessen die sehr lange laufen zur Fragmentierung des Adressraumes fuhren so dass der Prozess keinen weiteren Speicher anfordern kann obwohl die Summe der allozierten Speicherblocke wesentlich geringer als der verfugbare Speicher ist Die Effizienz des Prozessor Caches leidet darunter wenn eine Datenstruktur auf viele Speicherblocke verweist die im Adressraum weit auseinanderliegen Daher kann es sinnvoll sein stattdessen Tabellen bzw Felder engl array zu verwenden weil diese eine kompaktere Darstellung im Speicher haben Letzteres kann sich auch negativ im Zusammenhang mit Paging auswirken Nicht zuletzt ist ein Zeiger eine typische Ansatzstelle von Malware Das Schadprogramm braucht nur eine Stelle zu andern um auf den eigenen Programmcode zu zeigen Gibt es keine saubere Kontrolle des fur das Programm reservierten Speicherbereichs kann dieser auch beliebig anderswo liegen Ausserdem sind uber fehlgeleitete Zeiger auch Pufferuberlaufe einfach zu erzeugen Insbesondere konnen so in Datenvariablen liegende Programmcodes zur Ausfuhrung gelangen Dies stellt eine typische Methode zur Erstinfektion dar Weblinks Bearbeiten nbsp Commons Zeiger Informatik Sammlung von Bildern Videos und Audiodateien Zeiger in C Unsafe code pointer types and function pointers C documentation Pointers C Tutorials Pointers in C C with Examples C PointersEinzelnachweise Bearbeiten Roland Bickel Automatisierte statische Code Analyse fur sichere Software all electronics de vom 22 Oktober 2015 abgerufen am 4 Juli 2019 MSDN uber unsicheren Code und Zeiger in C a b c Chapter 8 Pointers and Memory Allocation Learning C with Pebble Abgerufen am 22 September 2023 Type Checking in Compiler Design In GeeksforGeeks 27 April 2022 abgerufen am 22 September 2023 amerikanisches Englisch std option Rust Abgerufen am 26 September 2023 Bjarne Stroustrup C Style and Technique FAQ Donald Knuth Fundamental Algorithms The Art of Computer Programming 3 Auflage Addison Wesley 1997 ISBN 0 201 89683 4 S 234 Normdaten Sachbegriff GND 4285887 2 lobid OGND AKS Abgerufen von https de wikipedia org w index php title Zeiger Informatik amp oldid 238922112