C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen Leibniz Universität IT Services Anja Aue
Zeiger (Pointer) Verweis auf eine Speicherstelle. Speicherung einer Speicheradresse. Platzhalter für den Beginn eines Speicherbereichs, an dem ein Wert von einem Datentyp gespeichert ist. C++ - Einführung 06.05.15 Seite 2
Vorteile / Nutzen Der Verweis auf eine Speicheradresse benötigt meist weniger Speicher als der Wert, auf den verwiesen wird. Manipulation von Werten an verschiedenen Positionen. Reservierung und Freigabe von Speicher. Implementation von Stacks, Listen etc. C++ - Einführung 06.05.15 Seite 3
in C++ int main() { double *ptrwert; double varwert; double summe; } varwert = 4.5; ptrwert = &varwert; summe = varwert + *ptrwert; return 0; Beispiele/_0601_Zeiger... C++ - Einführung 06.05.15 Seite 4
Deklaration double *ptrwert ; Datentyp *name ; double* ptrwert ; Datentyp* name ; Das Sternchen kennzeichnet einen Zeiger. Um Fehler zu vermeiden, sollte das Sternchen immer direkt vor dem Namen des Zeigers geschrieben werden. In diesem Beispiel verweist der Zeiger auf einen Wert vom Typ double. D. h. der Zeiger verweist auf einen Speicherbereich, der so groß ist, dass dort eine Gleitkommazahl vom Typ double abgelegt werden kann. C++ - Einführung 06.05.15 Seite 5
Datentypen eines Zeigers Wie viel Speicher wird benötigt? Wie wird der Wert interpretiert, auf den verwiesen wird? Alle Standardtypen und in Bibliotheken definierte Datentypen sind möglich. C++ - Einführung 06.05.15 Seite 6
Initialisierung ptrwert = &varwert ; Zeiger müssen mit einer Speicheradresse initialisiert werden. An dieser Speicheradresse kann zum Beispiel der Wert einer Variablen liegen. Der Zeiger und der Wert, auf den der Zeiger verweist, sollten den gleichen Datentyp haben. C++ - Einführung 06.05.15 Seite 7
Speicheradresse einer Variablen ptrwert = &varwert ; Das kaufmännische Und wird als Adressoperator bezeichnet. Der Adressoperator wird direkt vor den Anfang des Variablennamen geschrieben. Der Adressoperator gibt die Anfangsadresse eines Speicherbereichs von einer bestimmten Größe zurück. C++ - Einführung 06.05.15 Seite 8
Dereferenzierung varwert = *ptrwert ; Das Sternchen vor einem Zeiger in Anweisungen wird als Dereferenzierungsoperator bezeichnet. Mit Hilfe des Dereferenzierungsoperator wird der Wert an der Speicherstelle, auf die der Zeiger verweist, zurückgegeben. Eine Überprüfung der Speicheradresse auf Gültigkeit findet nicht statt. C++ - Einführung 06.05.15 Seite 9
Manipulation von Werten *ptrwert = *ptrwert * varwert ; Die Werte, auf die der Zeiger verweist, können entsprechend ihres Datentyps verwendet werden. Werte können mit Hilfe von Ausdrücken neu berechnet werden. C++ - Einführung 06.05.15 Seite 10
Grafische Darstellung: Deklaration der Variablen 00401008? int 0040100C? char 00401004? float der Zeiger 00501008 0050100C 00501004??? int * char * float * C++ - Einführung 06.05.15 Seite 11
Grafische Darstellung: Initialisierung der Variablen 00401008 0040100C 00401004 int var= 3 3?? int char float 00501008 0050100C 00501004 00401008?? int * char * float * C++ - Einführung 06.05.15 Seite 12
Grafische Darstellung: Initialisierung des Zeigers 00401008 3 int 0040100C? char 00401004? float int ptr = &var 00501008 00401008 int * 0050100C? char * 00501004? float * C++ - Einführung 06.05.15 Seite 13
Grafische Darstellung: Derefenzierung 00401008 553 int 0040100C? char 00401004? float *ptr = 5 00501008 00401008 int * 0050100C? char * 00501004? float * C++ - Einführung 06.05.15 Seite 14
Fehler double *ptrwert; double varwert; varwert = 4.5; *ptrwert = varwert; Wenn ein Zeiger nicht initialisiert ist, stürzt das Programm ab. Bei der Kompilierung wird kein Fehler gemeldet. C++ - Einführung 06.05.15 Seite 15
Undefinierter Zeiger double *ptrwert = NULL; int *ptrzahl = 0; double varwert; varwert = 4.5; ptrwert = &varwert; double *ptrwert; int *ptrzahl; double varwert; varwert = 4.5; ptrwert = &varwert; ptrwert = NULL; ptrzahl = 0; Der Zeiger ist undefiniert. Der Zeiger verweist auf keine Speicherstelle. NULL ist in der Bibliothek <iostream> definiert. C++ - Einführung 06.05.15 Seite 16
Ist der Zeiger undefiniert? if (ptrwert == NULL) { } if (!ptrwert) { } Wenn der Zeiger undefiniert ist,... C++ - Einführung 06.05.15 Seite 17
Dynamische Speicheranforderung int main() { int *ptrwert; ptrwert = new int(0); Beispiele/_0601_ZeigerDynamisch... } if(ptrwert) { *ptrwert = 1; delete ptrwert; } return 0; C++ - Einführung 06.05.15 Seite 18
Speicher anfordern int *ptrwert; ptrwert = new int(); Mit Hilfe des Schlüsselwortes new wird Speicher angefordert. Der Speicher wird im Heap des Rechners bereitgestellt. Dem Schlüsselwort folgt die benötigte Größe des Speicherbereichs. In diesem Beispiel wird Speicher für ein Integer angefordert. Falls nicht genügend Speicher vorhanden ist, wird ein undefinierter Zeiger zurück geliefert. C++ - Einführung 06.05.15 Seite 19
Anfordern und initialisieren int *ptrwert; ptrwert = new int(5); delete ptrwert; In den runden Klammern kann ein Wert zur Initialisierung des Speichers angegeben werden. C++ - Einführung 06.05.15 Seite 20
Speicher freigeben int *ptrwert; ptrwert = new int(); delete ptrwert; Mit Hilfe des Schlüsselwortes delete wird der angeforderte Speicher freigegeben. C++ - Einführung 06.05.15 Seite 21
Zeiger auf einen konstanten Wert const const char *ptrwert ; Datentyp *name ; Der Zeiger zeigt auf einen konstanten Wert an einer bestimmten Speicherstelle. Der Wert kann nicht verändert werden. C++ - Einführung 06.05.15 Seite 22
Konstanter Zeiger char * const ptrwert = &wert ; Datentyp * const name = &variable ; Die, in dem Zeiger gespeicherte Adresse, kann nicht verändert werden. Der Verweis ist konstant und darf nicht verändert werden. C++ - Einführung 06.05.15 Seite 23
Referenz Alias für eine andere Variable. Alternativer Name für eine Variablen Konstante Zeiger auf eine Variable. Zeiger können nicht auf Referenzen verweisen. C++ - Einführung 06.05.15 Seite 24
Beispiel int messwert = 10; int &wert = messwert; messwert = messwert + 2; wert = wert + 2; Beispiele/_0602_Referenz... C++ - Einführung 06.05.15 Seite 25
Deklaration char & wert = messwert ; Datentyp & name = variable ; Referenzen werden durch das kaufmännische Und gekennzeichnet. Referenzen müssen deklariert und gleichzeitig initialisiert werden. C++ - Einführung 06.05.15 Seite 26
Datenstrukturen Zusammenfassung von Variablen unterschiedlichsten Datentyps. Sammlung von Komponenten eines Ganzen. Beschreibung eines konkreten Objekts. Abstraktes Modell von Dingen aus der realen Welt. C++ - Einführung 06.05.15 Seite 27
Beispiele Personenname, Geburtsdatum und Geburtsort. x- und y-koordinaten. Artikel, Preis und deren Bestand im Lager. C++ - Einführung 06.05.15 Seite 28
Beispiele/_0603_Struktur... Beispiel struct umfrage{ char geschlecht; int alter; double gewicht; double groesse; }; int main(){ umfrage proband; proband.geschlecht = 'w'; proband.alter = 48 proband.groesse = 1.78; return 0; C++ - Einführung 06.05.15 Seite 29
Deklaration einer Struktur struct Strukturname Kopf { datentyp strukturelement ; datentyp strukturelment ; Rumpf } ; C++ - Einführung 06.05.15 Seite 30
Deklaration einer Struktur struct umfrage { }; Dem Schlüsselwort struct folgt der Name der Struktur. Die geschweiften Klammern kennzeichnen den Beginn und Ende des Rumpfes der Struktur. Innerhalb der geschweiften Klammern werden die Strukturelemente definiert. Die Datenstruktur wird mit einem Semikolon beendet. C++ - Einführung 06.05.15 Seite 31
Strukturelemente Beschreibung einer Komponente eines Objekts. Definition / Beschreibung eines Objekts. C++ - Einführung 06.05.15 Seite 32
Deklaration von Strukturelementen struct umfrage { char geschlecht; int alter; double gewicht; double groesse; }; Die Komponenten in einer Datenstruktur werden genauso wie Variablen deklariert. Strukturelemente können nur innerhalb einer Struktur deklariert werden. Jede Deklaration endet mit einem Semikolon. C++ - Einführung 06.05.15 Seite 33
Eigenschaften Jedes Element innerhalb der Struktur hat einen eindeutigen Namen. Jedes Strukturelemente ist von einem bestimmten Datentyp. Entsprechend des Datentyps wird Speicherplatz für die Komponenten bereitgestellt. Das Strukturelement wird über eine Variable vom Datentyp Struktur angesprochen. Das Strukturelement selber ist nur innerhalb der Struktur sichtbar. C++ - Einführung 06.05.15 Seite 34
Strukturvariable umfrage proband ; Strukturname variablenname ; Datentyp variablenname ; Die Variable ist vom Datentyp Struktur. Statt der Standard-Datentypen wie float, int etc. wird der Name einer Struktur als Datentyp genutzt. C++ - Einführung 06.05.15 Seite 35
Nutzung der Strukturvariablen proband. geschlecht variable. element Mit Hilfe des Punktoperators wird die Strukturvariable mit der Komponente verbunden. Die Strukturvariable ist vom Datentyp Struktur. In dieser Struktur ist das mit der Variable verbundene Element deklariert. C++ - Einführung 06.05.15 Seite 36
Zuweisung proband. geschlecht = 'w' ; variable. element = wert ; Mit Hilfe des Zuweisungsoperators wird der Strukturvariablen ein Wert zugewiesen. Strukturvariablen können genauso wie alle anderen Variablen entsprechend ihres Datentyps verwendet werden. C++ - Einführung 06.05.15 Seite 37
Zeiger und Strukturen struct umfrage{ char geschlecht; int alter; double gewicht; double groesse; }; Beispiele/_0603_Struktur... umfrage proband; double bmi = 0; umfrage *ptrproband = &proband; bmi = ptrproband->groesse * ptrproband->groesse; bmi = ptrproband->gewicht / bmi; C++ - Einführung 06.05.15 Seite 38
Deklaration des Zeigers umfrage *ptrproband ; Datentyp *name ; Statt eines Datentyps int etc. wird der Name der Struktur als Typ genutzt. C++ - Einführung 06.05.15 Seite 39
Initialisierung ptrproband = &proband ; Das kaufmännische Und wird als Adressoperator bezeichnet. Der Adressoperator wird direkt vor den Anfang der Variablen vom Datentyp Struktur geschrieben. Der Zeiger und die Variable sind vom gleichen Datentyp Struktur. C++ - Einführung 06.05.15 Seite 40
Zugriff auf die Strukturvariable ptrproband -> groesse Aus dem Bindestrich und dem Größer-Zeichen wird der Elementverweis zusammengesetzt. Mit Hilfe des Elementverweises wird der Zeiger mit einem Strukturelement verbunden. Der Zeiger verweist auf eine Struktur. In dieser Struktur ist das, rechts vom Operator stehende, Strukturelement definiert. C++ - Einführung 06.05.15 Seite 41