Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring...

31
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ “Dienstag” Andreas Döring [email protected] SS 2004

Transcript of Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring...

Page 1: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

Seminar: "Einführung in C/C++"

Einführung in die Programmiersprache C/C++

“Dienstag”

Andreas Dö[email protected]

SS 2004

Page 2: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de 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 [ ] [ ], ...

Page 3: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;

Page 4: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;

Page 5: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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

};

Page 6: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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

Page 7: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 8: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 9: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;

Page 10: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

Seminar: "Einführung in C/C++" 10

NullpointerEin Pointer kann auch eine 0 enthalten:

int * bar = 0;

int foo = *bar; //boeser Fehler!

Page 11: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 12: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 13: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 14: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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!

Page 15: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 16: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;

Page 17: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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

Page 18: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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!

Page 19: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 20: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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

Page 21: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.«

Page 22: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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

Page 23: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 24: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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.

Page 25: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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 << ".";

}

Page 26: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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);

Page 27: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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);

Page 28: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;

Page 29: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;

Page 30: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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};

Page 31: Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Dienstag Andreas Döring doering@inf.fu-berlin.de SS 2004.

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;