<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Zeiger_%28Informatik%29</id>
	<title>Zeiger (Informatik) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Zeiger_%28Informatik%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Zeiger_(Informatik)&amp;action=history"/>
	<updated>2026-06-01T10:52:51Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Zeiger_(Informatik)&amp;diff=108276&amp;oldid=prev</id>
		<title>imported&gt;BlackEyedLion: - Wikisyntax (Verweis auf einen Abschnitt mit #) im lesbaren Text</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Zeiger_(Informatik)&amp;diff=108276&amp;oldid=prev"/>
		<updated>2025-06-30T05:22:56Z</updated>

		<summary type="html">&lt;p&gt;- Wikisyntax (Verweis auf einen Abschnitt mit #) im lesbaren Text&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Pointers-de.svg|mini|240px|Der Zeiger &amp;#039;&amp;#039;a&amp;#039;&amp;#039; zeigt auf Variable &amp;#039;&amp;#039;b&amp;#039;&amp;#039;. Die Variable &amp;#039;&amp;#039;b&amp;#039;&amp;#039; enthält eine Nummer (binär 01101101) und die Variable &amp;#039;&amp;#039;a&amp;#039;&amp;#039; enthält die Speicheradresse von &amp;#039;&amp;#039;b&amp;#039;&amp;#039; (hexadezimal 1008). In diesem Fall passen die Adresse und die Daten in ein 32-Bit-[[Datenwort|Wort]].]]&lt;br /&gt;
[[Datei:Pointer (Zeiger) in C.ogv|mini|Video-Tutorial über Zeiger, Dereferenzierung, Felder und Zeigerarithmetik sowie deren Funktionsweise im Arbeitsspeicher am Beispiel der Programmiersprache C]]&lt;br /&gt;
&lt;br /&gt;
Mit &amp;#039;&amp;#039;&amp;#039;Zeiger&amp;#039;&amp;#039;&amp;#039; ({{enS|pointer}}) wird in der [[Informatik]] ein Objekt einer [[Programmiersprache]] bezeichnet, das eine [[Speicheradresse]] zwischenspeichert.&lt;br /&gt;
&lt;br /&gt;
Der Zeiger &amp;#039;&amp;#039;referenziert&amp;#039;&amp;#039; (verweist, zeigt&amp;amp;nbsp;auf) einen Ort im Hauptspeicher des Computers. Hier können [[Variable (Programmierung)|Variablen]], Objekte oder [[Anweisung (Programmierung)|Programmanweisungen]] gespeichert sein. Das Erlangen der dort hinterlegten Daten wird als &amp;#039;&amp;#039;dereferenzieren&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;rückverweisen&amp;#039;&amp;#039; bezeichnet; siehe den Abschnitt  [[#Zeigeroperationen|Zeigeroperationen]].&lt;br /&gt;
&lt;br /&gt;
Ein Zeiger ist ein Sonderfall und in einigen [[Programmiersprache]]n die einzige Implementierungsmöglichkeit des Konzepts einer [[Referenz (Programmierung)|Referenz]]. Zeiger werden in diesem Sinne auch als &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Referenzvariable&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Zeiger werden unter anderem dazu verwendet, den [[Dynamischer Speicher|dynamischen Speicher]] zu verwalten. So werden bestimmte Datenstrukturen, zum Beispiel [[verkettete Listen]], in der Regel mit Hilfe von Zeigern [[Implementierung|implementiert]].&lt;br /&gt;
&lt;br /&gt;
Der Zeiger wurde 1964/65 von [[Harold Lawson]] eingeführt und in der Programmiersprache [[PL/I]] implementiert.&lt;br /&gt;
&lt;br /&gt;
== Zeiger in Programmiersprachen ==&lt;br /&gt;
{{Siehe auch|Zeiger (C)}}&lt;br /&gt;
Zeiger kommen vor allem in maschinennahen Programmiersprachen, wie [[Assemblersprache|Assembler]] oder in Sprachen, die zur [[Systemprogrammierung]] geeignet sind, wie [[C (Programmiersprache)|C]] oder [[C++]], vor. Der Gebrauch in streng typisierten Sprachen wie [[Modula-2]] oder [[Ada (Programmiersprache)|Ada]] ist stark eingeschränkt und in Sprachen wie [[Java (Programmiersprache)|Java]] oder [[Eiffel (Programmiersprache)|Eiffel]] zwar intern vorhanden, aber für den Programmierer verborgen ([[Opaker Kontext|opak]]). Mit erstgenannten Sprachen ist es möglich, Zeiger auf beliebige Stellen im Speicher zu erzeugen oder mit ihnen zu rechnen.&lt;br /&gt;
&lt;br /&gt;
Manche Programmiersprachen schränken 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 häufige Ursachen für [[Pufferüberlauf|Pufferüberläufe]] oder [[Schutzverletzung|Speicherzugriffsverletzungen]] und daraus folgende [[Absturz (Computer)|Abstürze]] oder [[Sicherheitslücke]]n dar.&amp;lt;ref&amp;gt;Roland Bickel: [https://www.all-electronics.de/automatisierte-statische-code-analyse-fuer-sichere-software/ Automatisierte statische Code-Analyse für sichere Software], all-electronics.de vom 22. Oktober 2015, abgerufen am 4. Juli 2019.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In objektorientierten Sprachen tritt an die Stelle der Zeiger alternativ (C++) oder ausschließlich (Java, Python) die Referenz, die im Gegensatz zu Zeigern nicht ausdrücklich dereferenziert werden muss.&lt;br /&gt;
&lt;br /&gt;
=== Zeiger in C# ===&lt;br /&gt;
In der Sprache [[C-Sharp|C#]] oder [[Visual Basic .NET]] kommen Zeiger im Grunde nicht vor. Alle Funktionalitäten, die Zeiger bieten, wurden durch Konzepte wie [[Methodenzeiger|Delegate]] ersetzt. Es ist jedoch in C#, nicht aber in VB.NET möglich, unsicheren Code zu deklarieren (der auch speziell kompiliert werden muss), um Zeiger wie in C++ nutzen zu können.&amp;lt;ref&amp;gt;[http://msdn.microsoft.com/de-de/library/t2yzs44b(VS.80).aspx MSDN] über unsicheren Code und Zeiger in C#&amp;lt;/ref&amp;gt; Damit kann in manchen Fällen bessere [[Leistung (Informatik)|Leistung]] erreicht werden.&lt;br /&gt;
&lt;br /&gt;
Der [[Datentyp]], auf den ein Zeiger verweist, wird als Verweistyp bezeichnet. Zeigertypen können nur innerhalb eines Blocks hinter dem [[Schlüsselwort (Programmierung)|Schlüsselwort]] &amp;lt;code&amp;gt;unsafe&amp;lt;/code&amp;gt; verwendet werden. Nur bestimmte Datentypen, nämlich [[Datentyp#Elementare Datentypen|elementare Datentypen]], [[Aufzählungstyp]]en, Zeigertypen und Strukturtypen können ein Verweistyp sein. Es ist möglich, Konvertierungen zwischen verschiedenen Zeigertypen sowie zwischen Zeigertypen und ganzzahligen Datentypen durchzuführen.&lt;br /&gt;
&lt;br /&gt;
== Typisierung ==&lt;br /&gt;
Die Typisierung eines Zeigers sagt aus, ob der [[Datentyp]] des Zeigers selbst Auskunft über den Datentyp des Wertes, auf den der Zeiger verweist, gibt. Es wird zwischen typisierten und untypisierten Zeigern unterschieden.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;{{Internetquelle |url=https://pebble.gitbooks.io/learning-c-with-pebble/content/chapter08.html |titel=Chapter 8: Pointers and Memory Allocation · Learning C with Pebble |abruf=2023-09-22}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typisierte Zeiger können 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 Speichergröße des assoziierten Typs kann die Adresse des Vorgänger- oder Nachfolgeelementes berechnet werden.&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt; Darüber hinaus ermöglicht die Typisierung von Zeigern dem [[Compiler]], Verletzungen der [[Datentyp|Typkompatibilität]] zu erkennen.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.geeksforgeeks.org/type-checking-in-compiler-design/ |titel=Type Checking in Compiler Design |werk=GeeksforGeeks |datum=2022-04-27 |sprache=en-us |abruf=2023-09-22}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Untypisierte Zeiger können nicht dereferenziert, inkrementiert oder dekrementiert werden, sondern müssen vor dem Zugriff in einen typisierten Zeigertyp umgewandelt werden. Beispiele dafür sind der Typ &amp;lt;code&amp;gt;void*&amp;lt;/code&amp;gt; in C, C++ und [[D (Programmiersprache)|D]], in [[Objective-C]] vom Typ &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;POINTER&amp;lt;/code&amp;gt; in Pascal. In höheren Programmiersprachen existieren zum Teil keine untypisierten Zeiger.&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sonderfälle ==&lt;br /&gt;
&lt;br /&gt;
=== Nullzeiger ===&lt;br /&gt;
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 (Programmiersprache)|Rust]].&amp;lt;ref&amp;gt;{{Internetquelle |url=https://doc.rust-lang.org/std/option/index.html |titel=std::option - Rust |abruf=2023-09-26}}&amp;lt;/ref&amp;gt; Zum Beispiel wird eine einfach [[verkettete Liste]] meist so implementiert, dass dem Folgezeiger des letzten Elements der Wert des Nullzeigers gegeben wird, um auszudrücken, dass es kein weiteres Element gibt. Auf diese Weise lässt sich ein zusätzliches Feld, das das Ende der Liste zu bedeuten hätte, einsparen.&lt;br /&gt;
&lt;br /&gt;
In [[Pascal (Programmiersprache)|Pascal]] und [[Object Pascal]] heißt der Nullzeiger beispielsweise &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; (lateinisch: „nichts“ oder Akronym für „not in list“). In C kennzeichnet das in der [[Standard C Library|Standardbibliothek]] enthaltene [[C-Präprozessor|Präprozessor]]-Makro &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; den Nullzeiger und verdeckt die interne Repräsentation. In C++ heißt der Nullzeiger ebenfalls &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; und ist als Makro für die numerische Null (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) definiert.&amp;lt;ref&amp;gt;[[Bjarne Stroustrup]]: [http://www.stroustrup.com/bs_faq2.html#null C++ Style and Technique FAQ]&amp;lt;/ref&amp;gt; Im neuen C++-Standard C++11 wurde die Konstante &amp;lt;code&amp;gt;nullptr&amp;lt;/code&amp;gt; eingeführt, die eine typsichere Unterscheidung zwischen 0 und dem Nullzeiger ermöglicht. [[Donald Knuth]] stellt den Nullzeiger mit dem Symbol &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; dar,&amp;lt;ref&amp;gt;{{Literatur |Autor=Donald Knuth |Titel=Fundamental Algorithms |Reihe=The Art of Computer Programming |Auflage=3. |Verlag=Addison-Wesley |Datum=1997 |ISBN=0-201-89683-4 |Seiten=234}}&amp;lt;/ref&amp;gt; diese Konvention wird auch von den Werkzeugen [[WEB (Programmiersprache)|WEB]] und CWEB (ebenda) verwendet.&lt;br /&gt;
&lt;br /&gt;
Das Dereferenzieren eines Nullzeigers ist meist nicht erlaubt. Je nach Programmiersprache und Betriebssystem führt es zu [[Undefiniertes Verhalten|undefiniertem Verhalten]] oder einem Programmabbruch per Ausnahmebehandlung (englisch &amp;#039;&amp;#039;exception&amp;#039;&amp;#039;) bzw. [[Schutzverletzung]].&lt;br /&gt;
&lt;br /&gt;
=== Ungültige Zeiger ===&lt;br /&gt;
Falls eine Zeigervariable dereferenziert wird, die nicht auf einen gültigen 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 gültigen Wert initialisiert wurde (uninitialisierter Zeiger) oder wenn sie noch auf eine Speicheradresse verweist, die nicht mehr gültig ist ([[wilder Zeiger]]). Zeigt der Zeiger nicht auf eine gültige Speicheradresse, kann es wie beim Nullzeiger zu einer [[Schutzverletzung]] kommen.&lt;br /&gt;
&lt;br /&gt;
=== Intelligente Zeiger ===&lt;br /&gt;
{{Hauptartikel|Intelligenter Zeiger}}&lt;br /&gt;
Als [[Intelligenter Zeiger|Intelligente Zeiger]] (engl. &amp;#039;&amp;#039;smart pointers&amp;#039;&amp;#039;) werden Objekte bezeichnet, die einfache Zeiger einkapseln und mit zusätzlichen Funktionen und Eigenschaften ausstatten. Z.&amp;amp;nbsp;B. könnte ein &amp;#039;&amp;#039;smart pointer&amp;#039;&amp;#039; ein dynamisch alloziertes Speicherobjekt freigeben, sobald die letzte Referenz darauf gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Zeiger auf eine [[Component Object Model|COM]]- oder [[Common Object Request Broker Architecture|CORBA]]-[[Schnittstelle]] sind in manchen Programmiersprachen (z.&amp;amp;nbsp;B. [[Object Pascal]]) als [[Intelligenter Zeiger]] implementiert.&lt;br /&gt;
&lt;br /&gt;
=== Funktionszeiger (Methodenzeiger) ===&lt;br /&gt;
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 möglich, &amp;#039;&amp;#039;benutzerdefinierte&amp;#039;&amp;#039; Funktionsaufrufe, deren Ziel erst zur Laufzeit bestimmt wird, zu realisieren.&lt;br /&gt;
Funktionszeiger kommen häufig in Verbindung mit [[Rückruffunktion]]en &amp;#039;&amp;#039;(callback function)&amp;#039;&amp;#039; zum Einsatz und stellen eine Form der [[Polymorphie (Programmierung)#Inklusionspolymorphie|späten Bindung]] dar.&lt;br /&gt;
&lt;br /&gt;
{{Siehe auch|Methodenzeiger}}&lt;br /&gt;
&lt;br /&gt;
=== Memberzeiger ===&lt;br /&gt;
In C++ &amp;lt;!-- auch in anderen Sprachen? Wenn ja, welche? --&amp;gt; ist es möglich, analog zu [[Methodenzeiger]]n auch Zeiger auf die &amp;#039;&amp;#039;Daten&amp;#039;&amp;#039;member einer Klasse zu definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdint&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
struct RGB_Pixel {&lt;br /&gt;
    uint8_t red = 0, green = 0, blue = 128;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// definiert Typalias &amp;#039;Channel&amp;#039; als Zeiger auf uint8_t-Datenmember der Klasse RGB_Pixel&lt;br /&gt;
using Channel = uint8_t RGB_Pixel::*;&lt;br /&gt;
&lt;br /&gt;
// invertiert den ausgewählten RGB-Kanal aller Pixel eines Bildes&lt;br /&gt;
void invert(vector&amp;lt;RGB_Pixel&amp;gt;&amp;amp; image, Channel channel) {&lt;br /&gt;
    for(RGB_Pixel&amp;amp; pixel: image)&lt;br /&gt;
        pixel.*channel = 255 - pixel.*channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    vector&amp;lt;RGB_Pixel&amp;gt; image;&lt;br /&gt;
    // Memberzeiger zeigt auf den grünen RGB-Kanal&lt;br /&gt;
    Channel green = &amp;amp;RGB_Pixel::green;&lt;br /&gt;
    // nur der grüne RGB-Kanal wird invertiert&lt;br /&gt;
    invert(image, green);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zeigeroperationen ==&lt;br /&gt;
&lt;br /&gt;
; Dereferenzieren&lt;br /&gt;
: auf das Objekt, auf welches der Zeiger zeigt, zugreifen. Im Falle eines Funktionszeigers z.&amp;amp;nbsp;B. die referenzierte Funktion aufrufen&lt;br /&gt;
; Inkrementieren/Dekrementieren&lt;br /&gt;
: den Zeiger auf das Objekt versetzen, das sich im Speicher hinter/vor dem derzeitigen Objekt befindet. Intern wird dies durch Addition oder Subtraktion der Objektgröße realisiert. Diese ist dem Compiler nur bekannt, wenn der Typ des referenzierten Objekts während der [[Kompilierzeit]] klar gekennzeichnet ist.&lt;br /&gt;
; Zerstören&lt;br /&gt;
: des referenzierten Objektes (siehe [[Konstruktor|Konstruktor/Destruktor]]). Es bietet sich nach Aufruf des Destruktors an, alle Variablen, die Zeiger auf das zerstörte Objekt enthalten, auf den Nullwert zu setzen, um später erkennen zu können, dass kein gültiges Objekt mehr referenziert wird. Dies ist im Allgemeinen jedoch nicht möglich.&lt;br /&gt;
; Vergleichen&lt;br /&gt;
: mit anderen Zeigern auf Gleichheit/Ungleichheit. Manche Sprachen erlauben auch einen Größer-Kleiner-Vergleich zwischen Zeigern.&lt;br /&gt;
&lt;br /&gt;
== Zeigerarithmetik ==&lt;br /&gt;
Das Rechnen mit Zeigern auf Basis der Speichergröße des referenzierten Typs wird als Zeigerarithmetik bezeichnet. Dabei können Zeiger erhöht, verringert und subtrahiert werden. Alle Operationen berücksichtigen dabei die Größe des referenzierten Typs. Inkrementiert man beispielsweise den Zeiger auf einen vier Byte großen Datentyp um eins, so wird dessen Wert (also die Speicheradresse) um vier Bytes erhöht. Beim Subtrahieren zweier Zeiger erhält man die Anzahl dazwischen passender Objekte des referenzierten Typs.&lt;br /&gt;
&lt;br /&gt;
In Sprachen wie C wird die Zeigerarithmetik üblicherweise eingesetzt, um über terminierte Arrays zu iterieren, wie in folgendem Programm, das über das Array seiner Argumente iteriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main(int argc, char *argv[])  /* argv ist NULL-terminiert */&lt;br /&gt;
{&lt;br /&gt;
        char **cpp;&lt;br /&gt;
&lt;br /&gt;
        for (cpp = argv; *cpp; cpp++) {  /* cpp wird jeweils um die Größe von char* erhöht */&lt;br /&gt;
                printf(&amp;quot;arg: %s -- adr: %p\n&amp;quot;, *cpp, cpp);  /* dereferenzierter Wert und seine Adresse */&lt;br /&gt;
        }&lt;br /&gt;
        printf(&amp;quot;args: %lu\n&amp;quot;, cpp - argv);  /* Anzahl der Elemente im Array */&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Aufruf mit Ausgabe sieht auf einem [[64-Bit-Architektur|64-Bit-System]] beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./b foo bar&lt;br /&gt;
arg: ./b -- adr: 0x7fffffffea00&lt;br /&gt;
arg: foo -- adr: 0x7fffffffea08&lt;br /&gt;
arg: bar -- adr: 0x7fffffffea10&lt;br /&gt;
args: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da Zeigerarithmetik als fehleranfällig angesehen wird, wird sie in höheren Programmiersprachen meist nicht unterstützt, wobei dort andere Möglichkeiten gegeben sind, um die gleiche Funktionalität zu erlangen.&lt;br /&gt;
&lt;br /&gt;
=== Zeiger auf Arrays ===&lt;br /&gt;
Man kann in C und C++ einer Zeigervariablen direkt ein [[Feld (Datentyp)|Array]] zuweisen. Das Ergebnis ist, dass der Zeiger auf das erste Element des Arrays zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int  triangleNumbers[5];&lt;br /&gt;
 int* numbersPointer = triangleNumbers;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über diese Zeigervariablen kann man über den Index-Operator auf die einzelnen Elemente des Arrays zugreifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 numbersPointer[0] = 0;&lt;br /&gt;
 numbersPointer[1] = 1;&lt;br /&gt;
 numbersPointer[2] = 3;&lt;br /&gt;
 numbersPointer[3] = 6;&lt;br /&gt;
 numbersPointer[4] = 10;&lt;br /&gt;
 cout &amp;lt;&amp;lt; *numbersPointer &amp;lt;&amp;lt; endl;&lt;br /&gt;
 cout &amp;lt;&amp;lt; numbersPointer[3] &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel werden den Elementen des Arrays die ersten fünf [[Dreieckszahl]]en zugewiesen. Mit der vorletzten Anweisung wird der Inhalt des ersten Elements des Arrays, also &amp;#039;&amp;#039;0&amp;#039;&amp;#039;, ausgegeben. Mit der letzten Anweisung wird der Inhalt des Array-Elements mit dem Index 3, also &amp;#039;&amp;#039;6&amp;#039;&amp;#039;, ausgegeben.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften von Zeigern auf Daten ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
Die Verwendung von Zeigern kann in bestimmten Fällen den Programmablauf beschleunigen oder helfen, Speicherplatz zu sparen:&lt;br /&gt;
* Ist die von einem Programm im Speicher zu haltende Datenmenge am Programmstart unbekannt, so kann genau so viel Speicher angefordert werden, wie benötigt wird ([[Dynamischer Speicher|Dynamische Speicherverwaltung]]).&lt;br /&gt;
* Es ist möglich, während des Programmablaufs nicht mehr benötigten Speicher wieder an das Betriebssystem zurückzugeben.&lt;br /&gt;
* 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 darüber anzusprechen, setzt man zu Beginn des Ablaufs einen Zeiger auf den Anfang des Feldes und inkrementiert diesen Zeiger bei jedem Durchlauf. Die tatsächliche Schrittweite des Inkrements richtet sich nach dem betreffenden Datentyp. Diese Art des Zugriffs auf Felder wird in vielen [[Programmiersprache]]n und [[Compiler]]n an manchen Stellen intern automatisch so umgesetzt.&lt;br /&gt;
* Verweise auf Speicherbereiche können geändert werden, z.&amp;amp;nbsp;B. zur Sortierung von [[Liste (Datenstruktur)|Listen]], ohne die Elemente umkopieren zu müssen ([[dynamische Datenstruktur]]en).&lt;br /&gt;
* Bei Funktionsaufrufen kann durch die Übergabe eines Zeigers auf ein Objekt vermieden werden, das Objekt selbst zu übergeben, was eine in bestimmten Fällen sehr zeitaufwendige Anfertigung einer Kopie des Objektes erfordern würde ([[Referenzparameter]]).&lt;br /&gt;
* Anstatt Variablen jedes Mal zu kopieren und so jedes Mal erneut Speicherplatz zur Verfügung zu stellen, kann man in manchen Fällen einfach mehrere Zeiger auf dieselbe Variable verweisen lassen.&lt;br /&gt;
* Bei Zeichenketten können direkt Speicherinhalte angesprochen werden, ohne über Objekte und Funktionen gehen zu müssen.&lt;br /&gt;
&lt;br /&gt;
=== Nachteile und Gefahren ===&lt;br /&gt;
Es gibt Sprachen, die bewusst auf den Einsatz von Zeigern verzichten (s.&amp;amp;nbsp;o.). Dies hat vor allem folgende Gründe:&lt;br /&gt;
* Der Umgang mit Zeigern ist schwierig zu erlernen, kompliziert und fehleranfällig. Vor allem im Sinne von Zeigern zu denken, bereitet Programmieranfängern oft Schwierigkeiten. Auch bei erfahrenen Programmierern kommen Flüchtigkeitsfehler im Umgang mit Zeigern noch relativ häufig vor.&lt;br /&gt;
* In manchen Programmiersprachen ist keine effektive [[Datentyp]]-Kontrolle möglich, das heißt, beim Ausführen kann nicht kontrolliert werden, welche Daten an der Zieladresse stehen, und ob diese den Erwartungen (Spezifikationen) des Programmablaufs entsprechen&lt;br /&gt;
* Programmierfehler bei der Arbeit mit Zeigern können schwere Folgen haben. So kommt es z.&amp;amp;nbsp;B. zu Programmabstürzen, unbemerkter Beschädigung von Daten (durch vagabundierende Zeiger), [[Pufferüberlauf|Pufferüberläufen]] oder „verlorenen“ Speicherbereichen ([[Speicherleck]]s): Das Programm fordert ständig mehr Speicher an, der anderen Programmen nicht mehr zur Verfügung steht, bis im Extremfall das Betriebssystem nicht mehr genügend liefern kann.&lt;br /&gt;
* Setzen sich Datenstrukturen aus Zeigern zusammen, die auf einzelne kleine Speicherblöcke verweisen, kann dies insbesondere bei Prozessen, die sehr lange laufen, zur [[Externe Fragmentierung|Fragmentierung]] des Adressraumes führen, so dass der [[Prozess (Computer)|Prozess]] keinen weiteren Speicher anfordern kann, obwohl die Summe der allozierten Speicherblöcke wesentlich geringer als der verfügbare Speicher ist.&lt;br /&gt;
* Die Effizienz des [[Cache|Prozessor-Caches]] leidet darunter, wenn eine Datenstruktur auf viele Speicherblöcke verweist, die im Adressraum weit auseinanderliegen. Daher kann es sinnvoll sein, stattdessen [[Feld (Datentyp)|Tabellen bzw. Felder]] (engl.: &amp;#039;&amp;#039;array&amp;#039;&amp;#039;) zu verwenden, weil diese eine kompaktere Darstellung im Speicher haben.&lt;br /&gt;
* Letzteres kann sich auch negativ im Zusammenhang mit [[Paging]] auswirken.&lt;br /&gt;
* Nicht zuletzt ist ein Zeiger eine typische Ansatzstelle von [[Malware]]: Das Schadprogramm braucht nur eine Stelle zu ändern, um auf den eigenen Programmcode zu zeigen: Gibt es keine saubere Kontrolle des für das Programm reservierten Speicherbereichs, kann dieser auch beliebig anderswo liegen. Außerdem sind über fehlgeleitete Zeiger auch Pufferüberläufe einfach zu erzeugen. Insbesondere können so in Datenvariablen liegende Programmcodes zur Ausführung gelangen. Dies stellt eine typische Methode zur Erstinfektion dar.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Commonscat|Pointers (computing)|Zeiger (Informatik)}}&lt;br /&gt;
* [http://www.willemer.de/informatik/cpp/pointer.htm Zeiger in C++]&lt;br /&gt;
* [https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/unsafe-code Unsafe code, pointer types, and function pointers (C# documentation)]&lt;br /&gt;
* [https://www.cplusplus.com/doc/tutorial/pointers/ Pointers - C++ Tutorials]&lt;br /&gt;
* [https://www.geeksforgeeks.org/pointers-c-examples/ Pointers in C/C++ with Examples]&lt;br /&gt;
* [https://www.w3schools.com/cpp/cpp_pointers.asp C++ Pointers]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4285887-2}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;br /&gt;
[[Kategorie:Wikipedia:Artikel mit Video]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;/div&gt;</summary>
		<author><name>imported&gt;BlackEyedLion</name></author>
	</entry>
</feed>