Version [22720]
Dies ist eine alte Version von ProzProg9Zeiger erstellt von RonnyGertler am 2013-03-28 20:02:04.
Prozedurale Programmierung - Kapitel 9 - Zeiger
Inhalte von Dr. E. Nadobnyh
C/C++ enthält ein umfangreiches Zeigerkonzept, welches einen direkten Zugriff auf den Speicherplatz ermöglicht.
Ein Zeiger ist eine Variable, die eine Adresse einer Variablen oder einer Funktion enthält.
Synonyme: Pointer, Pointervariable, Zeigervariable.
Man kann auf eine adressierte Variable oder Funktion indirekt über einen Zeiger zugreifen. Ein Zeiger adressiert eine Speicherstelle und gibt mit dem Typ an, wie diese Speicherstelle zu verwenden ist.
Bei Zeigern sind immer zwei unterschiedliche Typen verwickelt:
1) Zeigertyp (Pointertyp, Adresstyp) ist eigenen Datentyp des Zeigers und der Adresse.
2) Basistyp ist Typ der Variablen (des Objektes), auf die der Zeiger “zeigt“.
In C werden Zeiger auf eine Variable, auf eine Funktion, auf ein Feld und auf ein Zeiger definiert.
Zeiger auf eine Variable. Definition
Ein Zeiger wird wie jede andere Variable definiert: T* name;
Mit T* wird der Datentyp des Zeigers und mit T der Datentyp der adressierten Variable (Basistyp) bezeichnet.
Beispiel: int* p1; float* p2;
Die Zeigervariablen p1 und p2 haben die Datentypen „Zeiger auf int“ und „Zeiger auf float“.
Mit der Definition wird der Speicherplatz für den Zeiger reserviert. Ein Zeiger belegt bei einem 32-bit-Betriebs-system immer 4 Bytes.
Ein uninitialisierter Zeiger wird wie jede andere Variable mit dem zufälligen Wert oder mit 0 initialisiert. Die Verwendung des uninitialisierten Zeigers verursacht einen Fehler, der oft schwer zu finden ist.
Initialisierter Zeiger
Wie jede andere Variable erhält ein Zeiger einen sinnvollen Wert bei der Definition oder durch die Zuweisung.
Eine Variablenadresse kann z.B. mit dem Adressoperator erhalten werden.
Beispiel: int a=3; int* p=&a;
Nach der Zeigerinitialisierung sagt man "p zeigt auf a".
⇒ Demo 1.
Nullzeiger
Ein Zeiger, der die Adresse NULL enthält, wird Nullzeiger (Nullpointer) genannt. Er zeigt auf kein gültiges Datenobjekt.
Es ist sinnvoll, Zeigervariablen mit NULL zu initialisieren, z.B.: double* p=NULL;
NULL ist als eine Adresse mit dem Wert 0 in der Standardbibliothek definiert.
Man sollt auch immer NULL statt den Zahlenwert 0 verwenden, denn es ist nicht sicher, ob die Länge einer Integer-Variablen auch der Länge einer Adresse entspricht.
Inhaltsoperator
Der Inhaltsoperator (Dereferenzierungsoperator, Verweisoperator, Indirektionsoperator) wird mittels * bezeichnet.
Er bildet ein Sprachkonstrukt *x, der als ein Verweis benannt wird. Statt x kann eine Adresse, ein Zeigername, ein Feldname usw. verwendet werden.
Die Ausführung eines Inhaltsoperators ist vom Kontext abhängig:
1) Wenn ein Verweis in einem Ausdruck steht, wird er auswertet, d.h. durch ein Wert ersetzt.
2) Wenn ein Verweis links vom Gleichheitszeichen steht, wird er als Zuweisung interpretiert.
Achtung: Begriffsverwirrung bei Verweis vs. Referenz, Zeiger, Punkt-Operator!
Impliziter Inhaltsoperator
Zur Laufzeit wird für jede Variable eine Adresse zugeordnet. Dabei wird der Variablenname durch den Verweis ersetzt.
Wenn der Variable a die Adresse 0012FF88 zugeordnet wird, dann kann z.B. die Zuweisung a=a+4; zur Laufzeit folgendermaßen aussehen:
Der Verweis *(0012FF88) enthält den impliziten Inhaltsoperator * .
CategoryProzProg
Diese Seite wurde noch nicht kommentiert.