Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring...
-
Upload
luitger-schmelzer -
Category
Documents
-
view
115 -
download
0
Transcript of Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring...
Seminar: "Einführung in C/C++"
Einführung in die Programmiersprache C/C++
“Dienstag”
Andreas Dö[email protected]
SS 2004
Seminar: "Einführung in C/C++" 2
Typen – welche kennen wir schon?
1. Einfache Typen:char, int, float, double, void, ...
2. Pointer:char *, int * *, void *, ...
3. Arrays:int [ ], float [ ] [ ], ...
Seminar: "Einführung in C/C++" 3
typedefMit typedef kann man Typbeschreibungen
Namen geben:
typedef int * IntPtr;
IntPtr x; x ist nun vom Typ int *
typedef char (* T)[10];
T y;
Seminar: "Einführung in C/C++" 4
Aufzählungstypen (enums)Definiere neuen Typ durch Aufzählung der
Werte, die eine Variable dieses Typs einnehmen kann:
enum Farbe
{
blau, rot, gelb, orange, gruen
};
Farbe x = gelb;
std::cout << gruen;
Seminar: "Einführung in C/C++" 5
enum-Werte sind ZahlenDie Werte eines enums werden bei der
Definition zu Synonymen von (ganzen) Zahlen:
enum Farbe { blau, rot, gelb };
Dann sind: blau == 0, rot == 1, gelb == 2.
Die Werte kann man auch explizit angeben:
enum Lieblingszahlen
{
Antwort = 42,
Teufel = 666
};
Seminar: "Einführung in C/C++" 6
Zur Erinnerung: PointerZeiger sind Variablen, deren Inhalt auf andere
Variablen verweist.
int * X; Zeiger auf eine int Variablefloat * Y; Zeiger auf eine flaot Variable
Seminar: "Einführung in C/C++" 7
Der address-of-Operator &Pointer speichern Adressen von Variablen ab.
int foo; Variable fooint * bar = & foo; & gibt Adresse von foo,
die dann in bar
gespeichert wird.
Mit dem address-of-Operator & kann man die Adresse einer Variablen bestimmen.
Seminar: "Einführung in C/C++" 8
Der indirection-Operator *Das Gegenteil zum address-of-Operator & ist
der indirection-Operator *:
int foo = 37; foo enthält 37.int * bar = & foo; bar zeigt auf foo.int foo2 = * bar; foo2 enthält auch 37.
Mit dem indirection-Operator kann man den Inhalt einer Variablen bestimmen, wenn man deren Adresse hat.
Seminar: "Einführung in C/C++" 9
* bar foo
X1 = foo; X1 = „Inhalt“ von foo= 37.
X2 = * bar; X2 = „Inhalt“ von * bar= „Inhalt“ von foo= 37.
int foo = 37; int * bar = & foo;
Seminar: "Einführung in C/C++" 10
NullpointerEin Pointer kann auch eine 0 enthalten:
int * bar = 0;
int foo = *bar; //boeser Fehler!
Seminar: "Einführung in C/C++" 11
Pointer auf PointerPointer können auch auf Pointer zeigen:
int foo = 5;
int * bar = & foo;
int * * bar2 = & bar;
std::cout << * * bar2; Ausgabe: 5
bar2 ist ein Pointer auf einen Pointer auf ein int.
*bar2 ist ein Pointer auf ein int.**bar2 ist ein int.
Seminar: "Einführung in C/C++" 12
Pointer und ArraysPointer zeigt auf Elemente eines Arrays:
int arr [3] = {2,3,5};
int * bar = arr; bar zeigt auf das
das erste Element
von arrint foo = * bar; setzt foo auf 2
Ein Array verhält sich so, als wäre es ein Pointer auf sein erstes Element.
Seminar: "Einführung in C/C++" 13
Der subscript-Operator [ ]Mit [ ] kann man auf die einzelnen Elemente
eines Arrays zugreifen:
int arr [3] = {2,3,5};
int foo = arr [2]; setzt foo auf 5
Der Index des ersten Elements eines Arrays ist 0.
Seminar: "Einführung in C/C++" 14
0 + 2 = 8Indirection-Operator * und Subcript-Operator [ ]
sind miteinander verwandt:
foo = arr[2]; foo = *(arr + 2);
Beides funktioniert auch mit Pointern.Aber Achtung:
int * bar = 0; bar enthält 0 bar = bar + 2; bar wird um 2 int
weiter gesetzt, und enthält nun also eine
8!
Seminar: "Einführung in C/C++" 15
C-StringsC-Strings sind Arrays von chars:char s1 [] = "hallo";
s1[1] = 'e'; s1 == "hello"
Vorsicht:char * s2 = "hallo";
s2[1] = 'e'; Fehler!
Grund: s2 zeigt zwar auf einen Speicherbereich, in dem "hallo" steht, dieser ist aber gewöhnlich nicht schreibbar.
Seminar: "Einführung in C/C++" 16
Mehrdimensionale ArraysMehrdimensionale Arrays werden einfach als
„Arrays von Arrays“ realisiert.Bsp.:
int arr2 [3][6];
ist ein Array von 3 Arrays von 6 ints.
Der Zugriff erfolgt z.B. mit mehreren [ ]:
int arr2 [3][6];
arr2[1][4] = 17;
Seminar: "Einführung in C/C++" 17
Der sizeof()-OperatorDer Operator sizeof() gibt den Speicherbedarf
einer Variablen (in Bytes) an:
int i; int j = sizeof(i); j == 4
Dies funktioniert auch für komplexere Typen:
short s[10]; sizeof(s) == 20
char * p; sizeof(p) == 1bool b; sizeof(b) == 1
Seminar: "Einführung in C/C++" 18
Arrays variabler Länge?... versuchen wir mal was:
int size;
cin >> size;
int arr [size]; Fehler beim Compilieren
Die Dimensionsangaben bei der Definition von Arrays muss eine zur Compilezeit bekannte Konstante sein!
Seminar: "Einführung in C/C++" 19
Der new - OperatorMit dem new-Operator kann man zur Laufzeit
Speicher für Variablen reservieren.Bsp.:int size;
cin >> size;
int * arr = new int [size];
new liefert einen Pointer auf den reservierten Speicher zurück. arr zeigt nun auf das erste Element eines Arrays von int mit size Elementen.
Seminar: "Einführung in C/C++" 20
Zu jedem new gehört ein delete!Ein mit dem new-Operator reservierter
Speicherbereich muss mit dem delete-Operator wieder freigegeben werden:
int * arr = new int [100];
// ...
// verwende arr
// ...
delete arr;
memory leak
Seminar: "Einführung in C/C++" 21
Themawechsel: lokale VariablenWiederholung:
Gültigkeit von Deklarationen
Regel 2: »Eine Deklaration, die innerhalb eines{ } -Blockes steht, gilt auch nur lokal innerhalb dieses Blockes.«
Seminar: "Einführung in C/C++" 22
Beispiel für eine lokale Variable
int X = 12;
int readNumber()
{
int X; neues X!
std::cin >> X;
return X;
}
int Y = readNumber();
std::cout << X; Ausgabe: 12
Seminar: "Einführung in C/C++" 23
Lokale Variablen sterben jung
int * getPrimArray()
{
int arr[] = {2, 3, 5, 7};
return arr; Problem!}
int * prims = getPrimArray();
Variable arr wird nach Ende der Funktion getPrimArray() zerstört.
Seminar: "Einführung in C/C++" 24
Lebensdauer von Variablen
1. Static-Variablen: Die Variable „lebt“ so lange wie das Programm läuft.
2. Auto-Variablen: Die Variable „lebt“ so lange, bis der die Definition umgebene { }-Block verlassen wird.
3. Heap-Variablen: Die Variable „lebt“ so lange, bis sie mit delete zerstört wird.
Seminar: "Einführung in C/C++" 25
Das Schlüsselwort staticMit static kann man eine lokale Variable von
einer Auto- zu einer Static-Variablen machen.Bsp.:
void ichZaehleMit()
{
static int count = 0;
++count;
std::cout << "Aufruf " << count << ".";
}
Seminar: "Einführung in C/C++" 26
Rückgabe in ArgumentenBeispiel für eine Funktion mit mehr als einem
Rückgabewert:
void nimmZwei(int * X, int * Y)
{
std::cin >> *X;
std::cin >> *Y;
}
int A, B;
nimmZwei(&A, &B);
Seminar: "Einführung in C/C++" 27
Alternative zu PointernDas gleiche Beispiel, aber diesmal mit
Referenzen:
void nimmZwei(int & X, int & Y)
{
std::cin >> X;
std::cin >> Y;
}
int A, B;
nimmZwei(A, B);
Seminar: "Einführung in C/C++" 28
ReferenzenTechnisch gesehen sind Referenzen Pointer
– sie tun aber so, als wären sie keine.
Pointer Referenzen
int X; int X;
int * ptr = & X; int & ref = X;
*ptr = 12; ref = 12;
Seminar: "Einführung in C/C++" 29
1. Quiz: Referenzen „umbiegen“.Frage: Was gibt dieses Programm aus?
int X = 5;
int Y = 8;
int & Z = X;
Z = Y;
std::cout << X;
Seminar: "Einführung in C/C++" 30
2. Quiz: ein kurzes ArrayFrage: Was ist der Unterschied zwischen
folgenden Variablen?
int Var1 = 5;
int Var2 [] = {5};
Seminar: "Einführung in C/C++" 31
3. Quiz: Lauter Zeichen!Was bedeuten die einzelnen markierten
Zeichen in folgendem Code?
int X [] = { 1, 2, 3 };
int Y = X[1] & X[2];
int & Z = X[0];
int * A = & Z;
Z = Z * * X;