C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

Ähnliche Dokumente
C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

C++ Teil 7. Sven Groß. 26. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 18

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

C++ Teil 7. Sven Groß. 3. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni / 16

C++ Teil 8. Sven Groß. 5. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 8 5. Dez / 16

Zeiger: Der Adressoperator &

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Programmierwerkstatt. Arrays, Pointer und Referenzen

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

Programmierung mit C Zeiger

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Crashkurs C++ - Teil 1

Intensivkurs C++ Tag 2: Grundlagen++ Marc Tschentscher Institut für Neuroinformatik

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

F Zeiger, Felder und Strukturen in C

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Felder (Arrays) und Zeiger (Pointers) - Teil I

Visuelle Kryptographie. Anwendung von Zufallszahlen

Felder (Arrays) und Zeiger (Pointers) - Teil I

Zeiger in C und C++ Zeiger in Java und C/C++

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

Algorithmen und Datenstrukturen

Mapra: C++ Teil 2. Felix Gruber, Sven Groß. 2. Mai 2017 IGPM. Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai / 11

INE1 Arrays, Zeiger, Datenstrukturen

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

Vorlesung Programmieren

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer)

8. Referenzen und Zeiger

Praxis der Programmierung

C++ Wiederholung. Sven Groß. 24. Juni Sven Groß (IGPM, RWTH Aachen) C++ Wiederholung 24. Juni / 90

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Dynamische Speicherverwaltung

Standardbibliotheken. Datentyp bool. Eingaben 2/2. Eingaben 1/2. In C gibt es keinen logischen Datentyp

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Einführung Pointer. C-Kurs 2013, 2. Vorlesung. Nico Andy

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Zeiger, Arrays und Strings in C und C++

Pointer und Arrays. INE1, Montag M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Grundlagen der Informatik 11. Zeiger

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

RO-Tutorien 3 / 6 / 12

Grundlagen der Informatik 6. Arrays I

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

Arrays,Strings&Pointer in C/C++

Felder (Arrays) und Zeiger (Pointers) - Teil I

Repetitorium Programmieren I + II

Dynamische Datentypen

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Zeiger. Zeiger ist eine Variable deren Wert eine Adresse enthält. Zeiger werden im Programm definiert. int *pmyinteger; Type *PointerName ;

Angewandte Mathematik und Programmierung

7.2 Dynamischer Speicher in Objekten/Kopierkonstruktor

2. Programmierung in C

Arrays. Einleitung. Deklarieren einer Array Variablen

RO-Tutorien 15 und 16

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Teil 8: Dynamische Speicherverwaltung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Programmieren I. Kapitel 12. Referenzen

DAP2 Praktikum Blatt 1

9. Vektoren. (auch Felder/array)

Einstieg in die Informatik mit Java

Informatik. Strukturen und Aufzählungstypen. Vorlesung

Programmieren in C++

Zeiger (Pointers) und Adressen

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Java Referenzdatentypen genauer betrachtet

Informatik Vorkurs - Vorlesung 2

Hydroinformatik I: Referenzen und Zeiger

Probeklausur Name: (c)

Kapitel 6: Dynamische Speicherverwaltung

Programmieren in Java

Einstieg in die Informatik mit Java

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

Kapitel 5: Funktionen. Inhalt

RO-Tutorien 17 und 18

Hydroinformatik I: Referenzen und Zeiger

Zeiger in C und C++ Zeiger in Java und C/C++

H S R R a p p e r s w i l \0

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

Polymorphismus 179. Function.h. #include <string>

Informatik I (D-MAVT)

Polymorphismus 44. Function.hpp. #include <string>

Einstieg in die Informatik mit Java

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

Einführung in die Programmierung

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Informatik 1 ( ) D-MAVT F2011. Pointer, Structs. Yves Brise Übungsstunde 6

10.4 Konstante Objekte

Transkript:

C++ Teil 6 Sven Groß 23. Nov 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 1 / 15

Themen der letzten Vorlesung const-deklaration Referenzen Zeiger Felder Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 2 / 15

Heutige Themen 1 Wdh.: Zeiger und Felder 2 Dynamische Speicherverwaltung 3 Casts bei Zeigern Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 3 / 15

Wdh.: Zeiger (Pointer) Variable, die eine Speicheradresse enthält int i= 5; double d= 47.11; int * iptr ; // Zeiger auf int double * dptr ; // Zeiger auf double Adressoperator & liefert Zeiger auf Variable (nicht zu verwecheln mit Referenz-Deklaration) iptr = &i; dptr = &d; Dereferenzierungsoperator * liefert Wert an Speicheradresse (nicht zu verwecheln mit Zeiger-Deklaration) cout << (* dptr ); // gibt d aus (* iptr )= 42; // i ist jetzt 42 dptr d Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 4 / 15

Beispiel: Referenzen und Zeiger 1 int a= 3; 2 int & r= a; // int - Referenz auf a 3 int *p= &a; // int - Zeiger auf a 4 // a hat Wert 3, r verweist auf 3, p zeigt auf 3 5 6 a+= 4; 7 cout << (* p) << endl ; 8 // a hat Wert 7, r verweist auf 7, p zeigt auf 7 9 10 r -= 2; 11 cout << a << endl ; 12 // a hat Wert 5, r verweist auf 5, p zeigt auf 5 13 14 (*p)= r*a; 15 cout << r << endl ; 16 // a hat Wert?, r verweist auf?, p zeigt auf? Quiz: Was verändert sich, wenn wir p als Zeiger auf const int deklarieren? Wie würde die Deklaration von p aussehen? Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 5 / 15

Wdh.: Felder (Arrays) Wichtiger Verwendungszweck für Zeiger: Felder Nummerierung der Einträge beginnt bei 0, endet bei n-1 Zugriff auf Einträge mit [ ]-Operator keine Bereichsprüfung (Speicherverletzung!!) double feld [5]= // legt ein Feld von 5 doubles an { 1, 2}; // ( initialisiert mit 1 2 0 0 0), // feld ist ein double - Zeiger for ( int i =2; i <5; ++i) feld [ i]= 0.7; // setzt Eintraege 2...4 cout << (* feld ); // gibt ersten Eintrag aus // ( feld [0] und * feld synonym ) feld [0] [1] [2] [3] [4] cout << feld [5]; // ungueltiger Zugriff! // Kein Compilerfehler, evtl. // Laufzeitfehler ( segmentation fault ) Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 6 / 15

Wdh.: Kopieren von Feldern double werte [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; double * nocheinfeld = werte ; // kopiert nur den Zeiger!!! nocheinfeld [2]= 99; // veraendert werte [2]!!! double richtig [5]; // neuen Speicher reservieren for ( int i =0; i <5; ++i) richtig [ i]= werte [ i]; // Werte kopieren Vorsicht beim Kopieren von Feldern! Zuweisung = verändert nur den Zeiger, nicht aber den Feldinhalt Kopie benötigt eigenen Speicher Eintrag für Eintrag kopieren Alternative für Felder: Vektoren bequem mit = kopieren Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 7 / 15

Spezielle char-felder: C-Strings Relikt aus C-Zeiten: C-Strings char-felder hören mit Terminationszeichen \0 auf Initialisierung mit "..." char cstring []= " Hallo "; // Zeichenkette mit 5 Zeichen, aber Feld mit 6 chars // { H, a, l, l, o, \0 } char message []= " Hier spricht Edgar Wallace \n"; // noch ein C- String string botschaft = message ; // C ++ - String, der mit C- String initialisiert wird const char * text = botschaft. c_str (); //... und wieder als C- String Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 8 / 15

Zeigerarithmetik Zeiger + int liefert Zeiger: double wert [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; cout << (* wert ); // gibt ersten Eintrag aus // ( wert [0] und * wert synonym ) double * zeig = wert + 3; cout << (* zeig ); // gibt vierten Eintrag aus // ( wert [3] und *( wert +3) synonym ) double * ptr = &( wert [2]); ptr ++; bool same = ( zeig == ptr ); // true Zeiger Zeiger liefert int (Abstand): int differenz = zeig - ptr, index = zeig - wert ; wert zeig [0] [1] [2] [3] [4] Quiz: Werte von differenz und index? Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 9 / 15

Beispiel: so geht es nicht... Beispiel: Funktion, die ein Feld kopieren soll 1 double * copy ( double * original, int n) 2 { 3 double kopie [ n]; // statisches Feld 4 for ( int i =0; i<n; ++i) 5 kopie [i]= original [i]; 6 return kopie ; 7 } 8 9 int main () 10 { 11 double zahlen [3]= { 1.2, 3.4, 5.6}; 12 double * zahlenkopie ; 13 zahlenkopie = copy ( zahlen, 3); 14... 15 return 0; 16 } Das funktioniert so nicht! Quiz: Wieso? Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 10 / 15

Dynamische Speicherverwaltung dynamische Felder, falls Speicher vor Verlassen des Scopes freigegeben werden soll falls Speicher nach Verlassen des Scopes freigegeben werden soll (in C: falls Länge erst zur Laufzeit festgelegt werden soll) Speicherplatz belegen (allocate) mit new Speicherplatz freigeben (deallocate) mit delete, passiert nicht automatisch! int * feld = new int [5]; // legt dyn. int - Feld der Laenge 5 an int * iptr = new int ; // legt dynamisch neuen int an... delete [] feld ; // Speicher wieder freigeben delete iptr ; Strikte Regel: Auf jedes new (bzw. new[]) muss später ein zugehöriges delete (bzw. delete[]) folgen! Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 11 / 15

Dynamische Speicherverwaltung (2) normale Variablen: (automatische Speicherverwaltung) werden erzeugt bei Variablendeklaration werden automatisch zerstört bei Verlassen des Scope dynamische Variablen: (dynamische Speicherverwaltung) werden erzeugt mit new (liefert Zeiger auf neuen Speicher zurück) werden zerstört mit delete (Freigabe des Speichers) volle Kontrolle = volle Verantwortung! Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 12 / 15

Dynamische Speicherverwaltung (3) 1 { 2 double x= 0.25, * dptr = 0; // neue double - Var. x, 3 // neuer double - Zeiger dptr 4 5 int * iptr = 0, a= 33; // neue int - Var. a, 6 // neuer int - Zeiger iptr 7 { 8 double y= 0.125; // neue double - Var. y 9 dptr = new double ; // neue double - Var. ( ohne Namen ) 10 * dptr = 0.33; 11 iptr = new int [4]; // neues int - Feld ( ohne Namen ) 12 13 } // Ende des Scope : y wird automatisch zerstoert 14 for ( int i =0; i <4; ++ i) 15 iptr [i]= i*i; 16... 17 delete [] iptr ; // int - Feld wird zerstoert 18 delete dptr ; // double - Var. wird zerstoert 19 20 } // Ende des Scope : Var. x, a werden automatisch zerstoert, 21 // Zeiger dptr, iptr werden automatisch zerstoert. Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 13 / 15

Beispiel: so ist es richtig Beispiel: Funktion, die ein Feld kopieren soll 1 double * copy ( double * original, int n) 2 { 3 double * kopie = new int [ n]; // dynamisches Feld 4 for ( int i =0; i<n; ++i) 5 kopie [i]= original [i]; 6 return kopie ; 7 } 8 9 int main () 10 { 11 double zahlen [3]= { 1.2, 3.4, 5.6}; 12 double * zahlenkopie ; 13 zahlenkopie = copy ( zahlen, 3); 14... 15 delete [] zahlenkopie ; // Speicher wieder frei geben 16 return 0; 17 } zahlenkopie zeigt auf gültigen Speicherbereich, da das mit new int[5] erzeugte dynamische Feld erst am Ende von main() mit delete[] zerstört wird. Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 14 / 15

Casts bei Zeigern void Ausgabe ( const double * feld, int n) {... } int main () { double data []= { 47, 11, 0, 8, 15}; } Ausgabe ( data, 5); return 0; Impliziter Cast double* const double* bei Aufruf von Ausgabe const ermöglicht nur Lesezugriff auf Einträge von feld, verhindert, dass Einträge von data versehentlich in der Funktion Ausgabe verändert werden Best Practice: const benutzen, wenn möglich mehr Datensicherheit Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 23. Nov 2015 15 / 15