Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken...

252
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. Systemprogrammierung Grundlage von Betriebssystemen I I Teil A – II. Einführung in die Programmiersprache C Jürgen Kleinöder Literatur zur C-Programmierung: Darnell, Margolis. C: A Software Engineering Approach. Springer 1991 Kernighan, Ritchie. The C Programming Language. Prentice-Hall 1988 Dausmann, Bröckl, Schoop, et al. C als erste Programmiersprache: Vom Einsteiger zum Fortgeschrittenen. (Als E-Book aus dem Uninetz verfügbar; PDF-Version unter /proj/i4sp1/pub). Vieweg+Teubner, 2010.

Transcript of Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken...

Page 1: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

SystemprogrammierungGrundlage von Betriebssystemen

IITeil A – II. Einführung in die Programmiersprache C

Jürgen Kleinöder

■ Literatur zur C-Programmierung:

■ Darnell, Margolis. C: A Software Engineering Approach. Springer 1991

■ Kernighan, Ritchie. The C Programming Language. Prentice-Hall 1988

■ Dausmann, Bröckl, Schoop, et al. C als erste Programmiersprache: VomEinsteiger zum Fortgeschrittenen. (Als E-Book aus dem Uninetz verfügbar;PDF-Version unter /proj/i4sp1/pub). Vieweg+Teubner, 2010.

Page 2: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 1 Überblick II–2

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

1 Überblick

■ Struktur eines C-Programms

■ Datentypen und Variablen

■ Anweisungen

■ Funktionen

■ C-Präprozessor

■ Programmstruktur und Module

■ Zeiger(-Variablen)

■ sizeof-Operator

■ Explizite Typumwandlung —Cast-Operator

■ Speicherverwaltung

■ Felder

■ Strukturen

■ Ein- /Ausgabe

■ Fehlerbehandlung

Page 3: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 2 StruktureinesC-Programms II–3

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

2 Struktur eines C-Programms

■ Beispiel

■ Übersetzen mit dem C-Compiler:cc -o hello hello.c

■ Ausführen durch Aufruf von ./hello

globale Variablendefinitionen

Funktionen

int main(int argc, char *argv[]) {VariablendefinitionenAnweisungen

}

int main(int argc, char *argv[]) {printf("Hello World!\n");return 0;

}

Page 4: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 3 DatentypenundVariablen II–4

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

3 Datentypen und Variablen

■ Datentyp := (<Menge von Werten>, <Menge von Operationen>)

• Literal Wert im C-Quelltext (z. B. 4711, 0xff, ’a’, 3.14)

• Konstante Bezeichner für einen Wert

• Variable Bezeichner für einen Speicherplatz,der einen Wert aufnehmen kann

• Funktion Bezeichner für eine Sequenz von Anweisungen,die einen Wert zurückgibt

➥ Literale, Konstanten, Variablen, Funktionen haben einen (Daten-)Typ

■ Datentyp legt fest:

• Repräsentation der Werte im Rechner

• Größe des Speicherplatzes für Variablen

• erlaubte Operationen

Page 5: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 3 Datentypen und Variablen | 3.1 Primitive Datentypen in C II–5

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 3.1 Primitive Datentypen in C

■ Ganzzahlen/Zeichen: char, short, int, long, long long➤ Wertebereich ist compiler-/prozessorabhängig

es gilt: char ≤ short ≤ int ≤ long ≤ long long

➤ Zeichen werden als Zahlen im ASCII-Code (8 Bit) dargestellt

➤ Zeichenketten (Strings) werden als Felder von char dargestellt

■ Fließkommazahlen: float, double, long double➤ Wertebereich/Genauigkeit ist compiler-/prozessorabhängig

■ Leerer Datentyp: void➤ Wertebereich: ∅➤ Einsatz: Funktionen ohne Rückgabewert

■ Boolescher Datentyp: bool (C99)➤ Bedingungsausdrücke (z. B. if(...)) sind in C aber vom Typ int!

■ Durch vorangestellte Typ-Modifier kann die Bedeutung verändert werden

➤ vorzeichenbehaftet: signed, vorzeichenlos: unsigned, konstant: const

Page 6: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 3 Datentypen und Variablen | 3.2 Variablen II–6

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 3.2 Variablen

■ Variablen werden definiert durch:

■ Namen (Bezeichner)

■ Typ

■ zugeordneten Speicherbereich für einen Wert des TypsInhalt des Speichers (= aktueller Wert der Variablen) ist veränderbar!

■ Lebensdauer

■ Variablenname

■ Buchstabe oder _ ,evtl. gefolgt von beliebig vielen Buchstaben, Ziffern oder _

Page 7: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 3 Datentypen und Variablen | 3.2 Variablen II–7

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

3.2 Variablen (2)

■ Typ und Bezeichner werden durch eineVariablen-Deklaration festgelegt (= dem Compiler bekannt gemacht)

■ reine Deklarationen werden erst in einem späteren Kapitel benötigt

■ vorerst beschränken wir uns auf Deklarationen in Variablen-Definitionen

■ eine Variablen-Definition deklariert eine Variableund reserviert den benötigten Speicherbereich

■ Beispiele

int a1;float a, b, c, dis;int anzahl_zeilen=5;const char trennzeichen = ’:’;

Page 8: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 3 Datentypen und Variablen | 3.2 Variablen II–8

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

3.2 Variablen (3)

■ Position von Variablendefinitionen im Programm:

■ nach jeder "{"

■ außerhalb von Funktionen

■ ab C99 auch an beliebigen Stellen innerhalb von Funktionenund im Kopf von for-Schleifen

■ Wert kann bei der Definition initialisiert werden

■ Wert ist durch Wertzuweisung und spezielle Operatoren veränderbar

■ Lebensdauer ergibt sich aus Programmstruktur

Page 9: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 3 Datentypen und Variablen | 3.3 Verbund-Datentypen / Strukturen (structs) II–9

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 3.3 Verbund-Datentypen / Strukturen (structs)

■ Zusammenfassen mehrerer Daten zu einer Einheit

■ Strukturdeklaration

■ Definition einer Variablen vom Typ der Struktur

■ Zugriff auf ein Element der Struktur

struct person {char name[20];int alter;

};

struct person p1;

p1.alter = 20;

Page 10: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.1 Anweisungen - Beispiele II–10

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

4 Anweisungen

| 4.1 Anweisungen - Beispiele■ a = b + c;

■ { a = b + c; x = 5; }

■ if (x == 5) a = 3;

Anweisung:

;Ausdruck

Block

Kontrollstruktur

Page 11: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.2 Ausdrücke II–11

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.2 Ausdrücke

■ Ausdruck = gültige Kombination vonOperatoren, Werten und Variablen

■ Reihenfolge der Auswertung

■ Die Vorrangregeln für Operatoren legen die Reihenfolge fest,in der Ausdrücke abgearbeitet werden

■ Geben die Vorrangregeln keine eindeutige Aussage,ist die Reihenfolge undefiniert

■ Mit Klammern ( ) können die Vorrangregeln überstimmt werden

■ Es bleibt dem Compiler freigestellt,Teilausdrücke in möglichst effizienter Folge auszuwerten

Page 12: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.3 Operatoren II–12

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.3 Operatoren

■ Zuweisungsoperator =

➥ Zuweisung eines Werts an eine Variable

■ Beispiel:int a;a = 20;

■ Arithmetische Operatoren

➥ für alle int und float Werte erlaubt+ Addition– Subtraktion* Mulitiplikation/ Division% Rest bei Division, (modulo)unäres – negatives Vorzeichen (z. B. –3 )unäres + positives Vorzeichen (z. B. +3 )

■ Beispiel:a = -5 + 7 * 20 - 8;

Page 13: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.4 spezielle Zuweisungsoperatoren II–13

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.4 spezielle Zuweisungsoperatoren

➥ Verkürzte Schreibweise für Operationen auf einer Variablen

a op= b ≡ a = a op bmit op ∈ { +, –, *, /, %, <<, >>, &, ^, |}

■ Beispiele:

int a = -8;

a += 24; /* -> a: 16 */a /= 2; /* -> a: 8 */

Page 14: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.5 Vergleichsoperatoren II–14

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.5 Vergleichsoperatoren

< kleiner

<= kleiner gleich

> größer

>= größer gleich

== gleich

!= ungleich

■ Beachte! Ergebnistyp int: wahr (true) = 1falsch (false) = 0

■ Beispiele:

a > 3a <= 5a == 0if ( a >= 3 ) { …

Page 15: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.6 Logische Operatoren II–15

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.6 Logische Operatoren

➥ Verknüpfung von Wahrheitswerten (wahr / falsch)

■ Wahrheitswerte (Boole’sche Werte) werden in Cgenerell durch int-Werte dargestellt:

➤ Operanden in einem Ausdruck: Operand = 0: falschOperand ≠ 0: wahr

➤ Ergebnis eines Ausdrucks: falsch: 0wahr: 1

"nicht"

f

w

!

w

f

"und"

f

w

&&

f

f

f

f

w

w

"oder"

f

w

||

f

w

f

w

w

w

Page 16: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.6 Logische Operatoren II–16

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

4.6 Logische Operatoren (2)

■ Beispiel:

a = 5; b = 3; c = 7;a > b && a > c

■ Die Bewertung solcher Ausdrücke wird abgebrochen,sobald das Ergebnis feststeht!

(a > c) && ((d=a) > b)

1 0und

0

0 wird nicht ausgewertet

Gesamtergebnis=falsch (d=a) wird nicht ausgeführt

Page 17: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.7 Bitweise logische Operatoren II–17

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.7 Bitweise logische Operatoren

➥ Operation auf jedem Bit einzeln (Bit 1 = wahr, Bit 0 = falsch)

■ Beispiele:

Antivalenzf

w

^

f

w

f

w

f

w

"exklusives oder"

"nicht" ~"und" &"oder" |

1 0 0 1 1 1 0 0

0 1 1 0 0 0 1 1

1 0 0 1 1 1 1 1

0 0 0 0 0 1 0 0

x

~x

x | 7

x & 7

1 0 0 1 1 0 1 1x ^ 7

0 0 0 0 0 1 1 17

Page 18: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.8 Logische Shiftoperatoren II–18

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.8 Logische Shiftoperatoren

➥ Bits werden im Wort verschoben

<< Links-Shift

>> Rechts-Shift

■ Beispiel:

0 1 1 1 0 0

0 1 1 1 0 00 1 1 1 0 00 1 1 1 0 00 1 1 1 0 01 0

0 0

x

x << 2

Page 19: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.9 Inkrement / Dekrement Operatoren II–19

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.9 Inkrement / Dekrement Operatoren

++ inkrement

-- dekrement

■ linksseitiger Operator: ++x bzw. --x

➤ es wird der Inhalt von x inkrementiert bzw. dekrementiert

➤ das Resultat wird als Ergebnis geliefert

■ rechtsseitiger Operator: x++ bzw. x--

➤ es wird der Inhalt von x als Ergebnis geliefert

➤ anschließend wird x inkrementiert bzw. dekrementiert.

■ Beispiele:

a = 10;b = a++; /* -> b: 10 und a: 11 */c = ++a; /* -> c: 12 und a: 12 */

Page 20: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.10 Bedingte Bewertung II–20

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.10 Bedingte Bewertung

A ? B : C

➥ der Operator dient zur Formulierung von Bedingungen in Ausdrücken

■ zuerst wird Ausdruck A bewertet

■ ist A ungleich 0, so hat der gesamte Ausdruck als Wert den Wert desAusdrucks B,

■ sonst den Wert des Ausdrucks C

| 4.11 Komma-Operator,

➥ der Komma-Operator erlaubt die Aneinanderreihung mehrerer Ausdrücke

■ ein so gebildeter Ausdruck hat als Wert den Wert des letzten Teil-Ausdrucks

Page 21: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.12 Typumwandlung in Ausdrücken II–21

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.12 Typumwandlung in Ausdrücken

■ Enthält ein Ausdruck Operanden unterschiedlichen Typs,erfolgt eine automatische Umwandlung in den Typ desin der Hierarchie der Typen am höchsten stehenden Operanden.(Arithmetische Umwandlungen)

char short

int

long int

float

double

Hierarchie der Typen (Auszug)

Page 22: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.13 Vorrangregeln bei Operatoren II–22

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.13 Vorrangregeln bei Operatoren

Operatorklasse Operatoren Assoziativitätunär ! ~ ++ -- + – von rechts nach linksmultiplikativ * / % von links nach rechtsadditiv + - von links nach rechtsshift << >> von links nach rechtsrelational < <= > >= von links nach rechtsGleichheit == != von links nach rechtsbitweise & von links nach rechtsbitweise ^ von links nach rechtsbitweise | von links nach rechtslogisch && von links nach rechtslogisch || von links nach rechtsBedingte Bewertung ?: von rechts nach linksZuweisung = op= von rechts nach linksReihung , von links nach rechts

Page 23: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.14 Blöcke II–23

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.14 Blöcke

■ Zusammenfassung mehrerer Anweisungen

■ Lokale Variablendefinitionen ➞ Hilfsvariablen

■ Schaffung neuer Sichtbarkeitsbereiche (Scopes) für Variablenmain(){

int x, y, z;x = 1;{

int a, b, c;a = x+1;{

int a, x;x = 2;a = 3;

}/* a: 2, x: 1 */

}}

Page 24: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.15 Kontrollstrukturen II–24

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.15 Kontrollstrukturen

■ Kontrolle des Programmablaufs in Abhängigkeit vom Ergebnis vonAusdrücken

Kontrollstruktur:

Bedingte Anweisung (if,else)

Einfache Verzweigung (goto)

Fallunterscheidung (switch, case)

Abweisende Schleife (while)

Nicht abweisende Schleife (do-while)

Laufanweisung (for)

Page 25: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 4 Anweisungen | 4.16 Kontrollstrukturen — Schleifensteuerung II–25

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.16 Kontrollstrukturen — Schleifensteuerung

■ break

■ bricht die umgebende Schleife bzw. switch-Anweisung ab

int c;

do {if ( (c = getchar()) == EOF ) break;putchar(c);

} while ( c != ’\n’ );

■ continue

■ bricht den aktuellen Schleifendurchlauf ab

■ setzt das Programm mit der Ausführung des Schleifenkopfes fort

Page 26: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.1 Funktionsdefinition II–26

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

5 Funktionen

■ Funktion =Programmstück (Block), das mit einem Namen versehen ist,dem zum Ablauf Parameter übergeben werden könnenund das bei Rückkehr einen Rückgabewert zurückliefern kann.

■ Funktionen sind die elementaren Bausteine für Programme

➥ verringern die Komplexität durch Zerteilen umfangreicher, schwerüberblickbarer Aufgaben in kleine Komponenten

➥ erlauben die Wiederverwendung von Programmkomponenten

➥ verbergen Implementierungsdetails vor anderen Programmteilen(Black-Box-Prinzip)

| 5.1 Funktionsdefinition

■ Schnittstelle = Ergebnistyp, Name, (formale) Parameter

■ + Implementierung

Page 27: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.2 Beispiel Sinusberechnung II–27

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 5.2 Beispiel Sinusberechnung

■ beliebige Verwendung von sinus in Ausdrücken:

y = exp(tau*t) * sinus(f*t);

#include <stdio.h>#include <math.h>

double sinus (double x){

double summe = 0.0;double x_quadrat = x*x;double rest = x;int k = 0;

while ( fabs(rest) > 1e-9 ) {summe += rest;k += 2;rest *= -x_quadrat/(k*(k+1));

}return summe;

}

int main(){

double wert;

printf("Berechnung des Sinus von ");scanf("%lf", &wert);printf("sin(%lf) = %lf\n",

wert, sinus(wert));return 0;

}

Page 28: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.3 Funktionsaufruf II–28

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 5.3 Funktionsaufruf

■ Die Ausdrücke in der Parameterliste werden ausgewertet, bevor in dieFunktion gesprungen wird➥ tatsächliche Parameter (actual parameters)

■ Anzahl und Typen der Ausdrücke in der Liste der tatsächlichen Parametermüssen mit denen der formalen Parameter in der Funktionsdefinitionübereinstimmen

■ Die Auswertungsreihenfolge der Parameterausdrücke ist nicht festgelegt

(

Ausdruck

Funktionsname

,

)

Liste der tatsächlichen Parameter

Page 29: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.4 Regeln II–29

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 5.4 Regeln

■ Funktionen werden global definiert

■ main() ist eine normale Funktion, die aber automatisch als erste beimProgrammstart aufgerufen wird

■ rekursive Funktionsaufrufe sind zulässig

➥ eine Funktion darf sich selbst aufrufen

Beispiel Fakultätsberechnung:

int fakultaet(int n){

if ( n == 1 )return 1;

elsereturn n * fakultaet(n-1);

}

Page 30: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.4 Regeln II–30

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

5.4 Regeln (2)

■ Funktionen müssen deklariert sein, bevor sie aufgerufen werden

= Rückgabetyp und Parametertypen müssen bekannt sein

■ durch eine Funktionsdefinition ist die Funktion automatisch auch deklariert

■ wurde eine verwendete Funktion vor ihrer Verwendung nicht deklariert, wirdautomatisch angenommen

➤ Funktionswert vom Typ int

➤ 1. Parameter vom Typ int

➥ völlig veralteter Programmierstil ➞ heute indiskutabel

➥ ab C99 nicht mehr zulässig

➤ verursacht bei vergessender Deklaration aber auch heute ggf. noch"komische" Fehlermeldungen

Page 31: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.5 Funktionsdeklaration II–31

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 5.5 Funktionsdeklaration

■ soll eine Funktion vor ihrer Definition verwendet werden, kann sie durch eineDeklaration bekannt gemacht werden (Prototyp)

■ Syntax:

➤ Parameternamen können weggelassen werden, die Parametertypen müssenaber angegeben werden!

■ Beispiel:

double sinus(double);

Typ Name ( Liste formaler Parameter );

Page 32: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.5 Funktionsdeklaration II–32

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

5.5 Funktionsdeklarationen — Beispiel#include <stdio.h>#include <math.h>

double sinus(double);/* oder: double sinus(double x); */

int main(){

double wert;

printf("Berechnung des Sinus von ");scanf("%lf", &wert);printf("sin(%lf) = %lf\n",

wert, sinus(wert));return 0;

}

double sinus (double x){

double summe = 0.0;double x_quadrat = x*x;double rest = x;int k = 0;

while ( fabs(rest) > 1e-9 ) {summe += rest;k += 2;rest *= -x_quadrat/(k*(k+1));

}return summe;

}

Page 33: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 5 Funktionen | 5.6 Parameterübergabe an Funktionen II–33

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 5.6 Parameterübergabe an Funktionen

■ allgemein in Programmiersprachen vor allem zwei Varianten:

➤ call by value (wird in C verwendet)

➤ call by reference (wird in C nicht verwendet)

■ call-by-value: Es wird eine Kopie des tatsächlichen Parameters an dieFunktion übergeben

➥ die Funktion kann den Übergabeparameter durch Zugriff auf denformalen Parameter lesen

➥ die Funktion kann den Wert des formalen Parameters (also die Kopie!)ändern, ohne dass dies Auswirkungen auf den Wert des tatsächlichenParameters beim Aufrufer hat

➥ die Funktion kann über einen Parameter dem Aufrufer keine Ergebnissemitteilen

Page 34: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 6 C-Präprozessor II–34

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

6 C-Präprozessor

■ bevor eine C-Quelle dem C-Compiler übergeben wird, wird sie durch einenMakro-Präprozessor bearbeitet

■ Anweisungen an den Präprozessor werden durch ein#-Zeichen am Anfang der Zeile gekennzeichnet

■ die Syntax von Präprozessoranweisungen ist unabhängig vom Rest derSprache

■ Präprozessoranweisungen werden nicht durch ; abgeschlossen!

■ wichtigste Funktionen:

#define Definition von Makros

#include Einfügen von anderen Dateien

Page 35: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 6 C-Präprozessor | 6.1 Makrodefinitionen II–35

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 6.1 Makrodefinitionen

■ Makros ermöglichen einfache textuelle Ersetzungen(parametrierbare Makros werden später behandelt)

■ ein Makro wird durch die #define–Anweisung definiert

■ Syntax:

■ eine Makrodefinition bewirkt, dass der Präprozessor im nachfolgenden Textder C-Quelle alle Vorkommen von Makroname durch Ersatztext ersetzt

■ Beispiel:

#define EOF -1

#define Makroname Ersatztext

Page 36: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 6 C-Präprozessor | 6.2 Einfügen von Dateien II–36

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 6.2 Einfügen von Dateien

■ #include fügt den Inhalt einer anderen Datei in eine C-Quelldatei ein

■ Syntax:

■ mit #include werden Header-Dateien mit Daten, die für mehrereQuelldateien benötigt werden, einkopiert

➤ Deklaration von Funktionen, Strukturen, externen Variablen

➤ Definition von Makros

■ wird Dateiname durch < > geklammert, wird eine Standard-Header-Dateieinkopiert

■ wird Dateiname durch " " geklammert, wird eine Header-Datei desBenutzers einkopiert (vereinfacht dargestellt!)

#include <Dateiname>oder#include "Dateiname"

Page 37: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.1 Softwaredesign II–37

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7 Programmstruktur & Module

| 7.1 Softwaredesign

■ Grundsätzliche Überlegungen über die Struktur eines Programmsvor Beginn der Programmierung

■ Verschiedene Design-Methoden

■ Top-down Entwurf / Prozedurale Programmierung

➤ traditionelle Methode

➤ bis Mitte der 80er Jahre fast ausschließlich verwendet

➤ an Programmiersprachen wie Fortran, Cobol, Pascal oder C orientiert

■ Objekt-orientierter Entwurf

➤ moderne, sehr aktuelle Methode

➤ Ziel: Bewältigung sehr komplexer Probleme

➤ auf Programmiersprachen wie C++, Smalltalk oder Java ausgerichtet

Page 38: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.2 Top-down Entwurf II–38

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.2 Top-down Entwurf

■ Zentrale Fragestellung

■ was ist zu tun?

■ in welche Teilaufgaben lässt sich die Aufgabe untergliedern?

➤ Beispiel: Rechnung für Kunden ausgeben– Rechnungspositionen zusammenstellen

– Lieferungsposten einlesen– Preis für Produkt ermitteln– Mehrwertsteuer ermitteln

– Rechnungspositionen addieren– Positionen formatiert ausdrucken

Page 39: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.2 Top-down Entwurf II–39

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.2 Top-down Entwurf (2)

■ Problem:Gliederung betrifft nur die Aktivitäten, nicht die Struktur der Daten

■ Gefahr:Sehr viele Funktionen arbeiten "wild" auf einer Unmenge schlechtstrukturierter Daten

Daten

Funktion1

Funktion2

Funktion3

Funktion4

Funktion5

Funktion6

Page 40: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.2 Top-down Entwurf II–40

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.2 Top-down Entwurf (3) — Modul-Bildung

■ Lösung:Gliederung von Datenbeständen zusammen mit Funktionen, die daraufoperieren

➥ Modul

Funktion1

Funktion2

Funktion3Funktion4 Funktion5

Funktion6

Page 41: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.3 Module in C II–41

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.3 Module in C

■ Teile eines C-Programms können auf mehrere .c-Dateien(C-Quelldateien) verteilt werden

■ Logisch zusammengehörende Daten und die darauf operierendenFunktionen sollten jeweils zusammengefasst werden

➥ Modul

■ Jede C-Quelldatei kann separat übersetzt werden (Option -c)

➤ Zwischenergebnis der Übersetzung wird in einer .o-Datei abgelegt

■ Das Kommando cc kann mehrere .c–Dateien übersetzen und dasErgebnis — zusammen mit .o–Dateien — binden:

% cc -c prog.c (erzeugt Datei prog.o )% cc -c f1.c (erzeugt Datei f1.o )% cc -c f2.c f3.c (erzeugt f2.o und f3.o )

% cc -o prog prog.o f1.o f2.o f3.o f4.c f5.c

Page 42: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.3 Module in C II–42

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.3 Module in C (2)

!!! .c–Quelldateien auf keinen Fall mit Hilfe der #include–Anweisung inandere Quelldateien einkopieren

■ Bevor eine Funktion aus einem anderen Modul aufgerufen werden kann,muss sie deklariert werden

➤ Parameter und Rückgabewerte müssen bekannt gemacht werden

■ Makrodefinitionen und Deklarationen, die in mehreren Quelldateien einesProgramms benötigt werden, werden zu Header-Dateien zusammengefasst

■ Header-Dateien werden mit der #include–Anweisung des Präprozessors inC-Quelldateien einkopiert

■ der Name einer Header-Datei endet immer auf .h

Page 43: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.4 Gültigkeit von Namen II–43

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.4 Gültigkeit von Namen

■ Gültigkeitsregeln legen fest, welche Namen (Variablen und Funktionen) woim Programm bekannt sind

■ Mehrere Stufen

1. Global im gesamten Programm(über Modul- und Funktionsgrenzen hinweg)

2. Global in einem Modul(auch über Funktionsgrenzen hinweg)

3. Lokal innerhalb einer Funktion

4. Lokal innerhalb eines Blocks

■ Überdeckung bei Namensgleichheit

➤ eine lokale Variable innerhalb einer Funktion überdeckt gleichnamige globaleVariablen

➤ eine lokale Variable innerhalb eines Blocks überdeckt gleichnamige globaleVariablen und gleichnamige lokale Varibalen in umgebenden Blöcken

Page 44: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.5 Globale Variablen II–44

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.5 Globale Variablen

■ Gültig im gesamten Programm

■ Globale Variablen werden außerhalb von Funktionen definiert

■ Globale Variablen sind ab der Definition in der gesamten Datei zugreifbar

■ Globale Variablen, die in anderen Modulen definiert wurden, müssen vordem ersten Zugriff bekanntgemacht werden( extern–Deklaration = Typ und Name bekanntmachen)

■ Beispiele:

extern int a, b;extern char c;

Page 45: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.5 Globale Variablen II–45

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.5 Globale Variablen (2)

■ Probleme mit globalen Variablen

■ Zusammenhang zwischen Daten und darauf operierendem Programmcodegeht verloren

■ Funktionen können Variablen ändern, ohne dass der Aufrufer dies erwartet(Seiteneffekte)

■ Programme sind schwer zu pflegen, weil bei Änderungen der Variablen erst alleProgrammteile, die sie nutzen gesucht werden müssen

➥ globale Variablen möglichst vermeiden

Page 46: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.5 Globale Variablen II–46

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.5 Globale Funktionen

■ Funktionen sind generell global(es sei denn, die Erreichbarkeit wird explizit auf das Modul begrenzt)

■ Funktionen aus anderen Modulen müssen ebenfalls vor dem ersten Aufrufdeklariert werden(= Typ, Name und Parametertypen bekanntmachen)

■ Das Schlüsselwort extern ist bei einer Funktionsdeklaration nicht notwendig

■ Beispiele:

double sinus(double);float power(float, int);

■ Globale Funktionen (und soweit vorhanden die globalen Daten) bilden dieäußere Schnittstelle eines Moduls

➤ "vertragliche" Zusicherung an den Benutzer des Moduls

Page 47: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II)7 Programmstruktur & Module | 7.6 Einschränkung der Gültigkeit auf ein Modul II–47

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.6 Einschränkung der Gültigkeit auf ein Modul

■ Zugriff auf eine globale Variable oder Funktion kann auf das Modul (= dieDatei) beschränkt werden, in der sie definiert wurde

➤ Schlüsselwort static vor die Definition setzen

➤ Beispiel: static int a;

➥ extern-Deklarationen in anderen Modulen sind nicht möglich

■ Die static-Variablen bilden zusammen den Zustand eines Moduls,die Funktionen des Moduls operieren auf diesem Zustand

■ Hilfsfunktionen innerhalb eines Moduls, die nur von den Modulfunktionenbenötigt werden, sollten immer static definiert werden

➤ sie werden dadurch nicht Bestandteil der Modulschnittstelle(= des "Vertrags" mit den Modulbenutzern)

!!! das Schlüsselwort static gibt es auch bei lokalen Variablen(mit anderer Bedeutung! - dort jeweils kursiv geschrieben)

Page 48: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.7 Lokale Variablen II–48

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.7 Lokale Variablen

■ Variablen, die innerhalb einer Funktion oder eines Blocks definiert werden,sind lokale Variablen

■ bei Namensgleichheit zu globalen Variablen oder lokalen Variablen einesumgebenden Blocks gilt die jeweils letzte Definition

■ lokale Variablen sind außerhalb des Blocks, in dem sie definiert wurden,nicht zugreifbar und haben dort keinen Einfluss auf die Zugreifbarkeit vonVariablen

Page 49: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.8 Gültigkeitsbereiche — Übersicht II–49

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.8 Gültigkeitsbereiche — Übersicht

Funktion6

Funktion1

Funktion2

Funktion3

Funktion4

Funktion5

Modul1 Modul2 Modul3

globaleVariablen

modul-lokaVariablen=global sta

funktions-lokaleVariablen

modul-lokaleFunktion

modul-lokaFunktion

globaleFunktionen

(= static)

Page 50: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.9 Lebensdauer von Variablen II–50

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 7.9 Lebensdauer von Variablen

■ Die Lebensdauer einer Variablen bestimmt, wie lange der Speicherplatz fürdie Variable aufgehoben wird

■ Zwei Arten

■ Speicherplatz bleibt für die gesamte Programmausführungszeit reserviert

➤ statische (static) Variablen

■ Speicherplatz wird bei Betreten eines Blocks reserviert und danach wiederfreigegeben

➤ dynamische (auto) Variablen

Page 51: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.9 Lebensdauer von Variablen II–51

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.9 Lebensdauer von Variablen (2)

auto-Variablen

■ Alle lokalen Variablen sind automatic-Variablen

➤ der Speicher wird bei Betreten des Blocks / der Funktion reserviert und beiVerlassen wieder freigegeben

➥ der Wert einer lokalen Variablen ist beim nächsten Betreten des Blocksnicht mehr sicher verfügbar!

■ Lokale auto-Variablen können durch beliebige Ausdrücke initialisiert werden

➤ die Initialisierung wird bei jedem Eintritt in den Block wiederholt

!!! wird eine auto-Variable nicht initialisiert, ist ihr Wert vor der erstenZuweisung undefiniert (= irgendwas)

Page 52: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 7 Programmstruktur & Module | 7.9 Lebensdauer von Variablen II–52

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

7.9 Lebensdauer von Variablen (3)

static-Variablen

■ Der Speicher für alle globalen Variablen ist generell von Programmstart bisProgrammende reserviert

■ Lokale Variablen erhalten bei Definition mit dem Schlüsselwort static eineLebensdauer über die gesamte Programmausführung hinweg

➥ der Inhalt bleibt bei Verlassen des Blocks erhalten und ist bei einemerneuten Eintreten in den Block noch verfügbar

!!! Das Schlüsselwort static hat bei globalen Variablen eine völlig andereBedeutung (Einschränkung des Zugriffs auf das Modul)

■ Static-Variablen können durch beliebige konstante Ausdrücke initialisiertwerden

➤ die Initialisierung wird nur einmal beim Programmstart vorgenommen (auchbei lokalen Variablen!)

➤ erfolgt keine explizite Initialisierung, wird automatisch mit 0 vorbelegt

Page 53: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.1 Einordnung II–53

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8 Zeiger(-Variablen)

| 8.1 Einordnung

■ Konstante:Bezeichnung für einen Wert

■ Variable:Bezeichnung für ein Datenobjekt

■ Zeiger-Variable (Pointer):Bezeichnung einer Referenz auf einDatenobjekt

0110 0001’a’ ≡

a

char *p = &a;

a

•p

Page 54: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.2 Überblick II–54

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.2 Überblick

■ Eine Zeigervariable (pointer) enthält als Wert die Adresse einer anderenVariablen

➥ der Zeiger verweist auf die Variable

■ Über diese Adresse kann man indirekt auf die Variable zugreifen

■ Daraus resultiert die große Bedeutung von Zeigern in C

➥ Funktionen können (indirekt) ihre Aufrufparameter verändern(call-by-reference)

➥ dynamische Speicherverwaltung

➥ effizientere Programme

■ Aber auch Nachteile!

➥ Programmstruktur wird unübersichtlicher(welche Funktion kann auf welche Variable zugreifen?)

➥ häufigste Fehlerquelle bei C-Programmen

'

Page 55: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen II–55

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

5y

➊ ➋

Page 56: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.4 Adressoperatoren II–56

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.4 Adressoperatoren

■ Adressoperator & .

&x der unäre Adress-Operator liefert eine Referenz auf den Inhaltder Variablen (des Objekts) x

■ Verweisoperator * .

*x der unäre Verweisoperator * ermöglicht den Zugriff auf den Inhaltder Variablen (des Objekts), auf die der Zeiger x verweist

★ Unterschied des Symbols *in einer Variablendefinition und in einem Ausdruck

➤ int *ip; * in einer Variablendefinition:ip ist eine Variable vom Typ (int *),eine Variable die auf ein Objekt vom Typ (int) verweist

➤ y = *ip; * als Operator in einem Ausdruck:ip ist eine Variable, die auf ein Objekt vom Typ (int) verweist,der Ausdruck *ip ermittelt den Inhalt dieses Objekts, also den int-Wert➥ das Ergebnis des Ausdrucks *ip ist ein Wert vom Typ (int)

Page 57: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–57

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.5 Zeiger als Funktionsargumente

■ Parameter werden in C by-value übergeben

■ die aufgerufene Funktion kann den tatsächlichen Parameter beim Aufrufernicht verändern

■ auch Zeiger werden by-value übergeben, d. h. die Funktion erhält lediglicheine Kopie des Adressverweises

■ über diesen Verweis kann die Funktion jedoch mit Hilfe des *-Operators aufdie zugehörige Variable zugreifen und sie verändern

➥ call-by-reference

''

Page 58: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–58

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);...

}

void swap (int *px, int *py){

int tmp;

tmp = *px;*px = *py;*py = tmp;

}

47a

px

b 11

py

tmp

Page 59: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–59

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b); ➊...

}

void swap (int *px, int *py){

int tmp;

tmp = *px;*px = *py;*py = tmp;

}

47a

px

b 11

py

tmp

Page 60: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–60

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);...

}

void swap (int *px, int *py){

int tmp;

tmp = *px;*px = *py;*py = tmp;

}

47a

px

b 11

py •

tmp

Page 61: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–61

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);...

}

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py;*py = tmp;

}

47a

px

b 11

py •

tmp 47

➋*px

Page 62: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–62

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);...

}

void swap (int *px, int *py){

int tmp;

tmp = *px;*px = *py; ➌*py = tmp;

}

11a

px

b 11

py •

tmp 47

➌*px

*py

Page 63: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–63

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);...

}

void swap (int *px, int *py){

int tmp;

tmp = *px;*px = *py;*py = tmp; ➍

}

11a

px

b 47

py •

tmp 47

*py

Page 64: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente II–64

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b); ➊...

}

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌*py = tmp; ➍

}

a

px

b

py •

tmp

Page 65: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.6 Zeiger auf Strukturen II–65

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.6 Zeiger auf Strukturen

■ Konzept analog zu "Zeiger auf Variablen"

➤ Adresse einer Struktur mit &-Operator zu bestimmen

■ Beispiele

■ Besondere Bedeutung zum Aufbau verketteter Strukturen

struct person stud1;struct person *pstud;pstud = &stud1; /* ⇒ pstud → stud1 */

Page 66: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.6 Zeiger auf Strukturen II–66

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.6 Zeiger auf Strukturen (2)

■ Zugriff auf Strukturkomponenten über einen Zeiger

■ Bekannte Vorgehensweise

➤ *-Operator liefert die Struktur

➤ .-Operator zum Zugriff auf Komponente

➤ Operatorenvorrang beachten

■ Syntaktische Verschönerung

➥ ->-Operator

(*pstud).best = ’n’;➥ (*pstud).alter = 21; nicht so gut leserlich!

(*pstud).best = ’n’;pstud->alter = 21;

Page 67: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 8 Zeiger(-Variablen) | 8.7 Zusammenfassung II–67

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.7 Zusammenfassung

■ Struktur

■ Zeiger auf Struktur

int a;struct s{int a; char c;}; struct s s1 = {2, ’a’};

s1 2a

int a; struct s *sp = &s1;

s1 2a•sp

■ Variable

■ Zeiger

int a; int a;a 5

int a; int *p = &a;a 5

•p

Page 68: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 9 Felder | 9.1 Eindimensionale Felder II–68

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

9 Felder

| 9.1 Eindimensionale Felder

■ eine Reihe von Daten desselben Typs kann zu einem Feldzusammengefasst werden

■ bei der Definition wird die Größe des Felds angegeben

➤ Größe muss eine Konstante sein

➤ ab C99 bei lokalen Feldern auch zur Laufzeit berechnete Werte zulässig

■ der Zugriff auf die Elemente erfolgt durch Indizierung, beginnend bei Null

■ Definition eines Feldes

■ Beispiele:

int x[5];double f[20];

Typ Name [ ] Initialisierung ;Größe

Page 69: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 9 Felder | 9.2 Initialisierung eines Feldes II–69

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 9.2 Initialisierung eines Feldes

■ Ein Feld kann durch eine Liste von konstanten Ausdrücken, die durchKomma getrennt sind, initialisiert werden

int prim[4] = {2, 3, 5, 7};char name[5] = {’O’, ’t’, ’t’, ’o’, ’\0’};

■ wird die explizite Felddimensionierung weggelassen, so bestimmt die Zahlder Initialisierungskonstanten die Feldgröße

int prim[] = {2, 3, 5, 7};char name[] = {’O’, ’t’, ’t’, ’o’, ’\0’};

■ werden zu wenig Initialisierungskonstanten angegeben, so werden dierestlichen Elemente mit 0 initialisiert

■ char-Felder können auch durch String-Literale initialisiert werdenchar name1[5] = "Otto";char name2[] = "Otto";

=konstanterAusdruck{

,

}

Page 70: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 9 Felder | 9.3 Zugriffe auf Feldelemente II–70

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 9.3 Zugriffe auf Feldelemente

■ Indizierung:

wobei: 0 <= Wert(Ausdruck) < Feldgröße

■ Achtung: Feldindex wird nicht überprüft

➥ häufige Fehlerquelle in C-Programmen

■ Beispiele:

prim[0] == 2prim[1] == 3name[1] == ’t’name[4] == ’\0’

'

[Feldname Ausdruck ]

Page 71: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–71

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

array ≡

ip •

Page 72: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–72

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array;

int *ep;ep = &array[0]; ➋

array ≡

ip •

ep

• •

Page 73: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–73

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array;

int *ep;ep = &array[0]; ➋

array ≡

ip •

ep •

Page 74: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–74

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array;

int *ep;ep = &array[0];

ep = &array[2]; ➌

array ≡

ip •

ep • ➌

Page 75: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–75

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array;

int *ep;ep = &array[0];

ep = &array[2]; ➌

array ≡

ip •

ep • ➌

Page 76: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–76

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array;

int *ep;ep = &array[0];

ep = &array[2];

*ep = 1; ➍

array ≡

ip •

ep •

1 ➍

*ep

Page 77: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 ZeigerundFelder II–77

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldesarray ≡ &array[0]

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

'

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

1➊

• ➍

➌➋

Page 78: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen II–78

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

■ +, –Addition und Subtraktion von Zeigernund ganzzahligen Werten.

Dabei wird immer die Größe desObjekttyps berücksichtigt!

!!! Achtung: Assoziativität der Operatoren beachten

int array[3];int *ip = array; ➊

ip++; ➋

ip++; ➌

array ≡

ip •

➊➋ ➌

ip •

int array[5];ip = array; ➊

ip = ip+3; ➋

Page 79: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder II–79

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.2 Zeigerarithmetik und Felder

■ Ein Feldname ist eine Konstante für die Adresse des Feldanfangs

➥ Feldname ist ein ganz normaler Zeiger

➤ Operatoren für Zeiger anwendbar ( *, [] )

➥ aber keine Variable ➔ keine Modifikationen erlaubt

➤ keine Zuweisung, kein ++, --, +=, …

■ In Kombination mit Zeigerarithmetik lässt sich in C jede Feldoperation aufeine äquivalente Zeigeroperation abbilden

➤ für int array[N], *ip = array; mit 0 ≤ i < N gilt:

■ Umgekehrt können Zeigeroperationen auch durch Feldoperationendargestellt werden (nur der Feldname darf nicht verändert werden)

'

array ≡ &array[0] ≡ ip ≡ &ip[0]*array ≡ array[0] ≡ *ip ≡ ip[0]

*(array + i) ≡ array[i] ≡ *(ip + i) ≡ ip[i]array++ ≡/ ip++

Fehler: array ist konstant!

Page 80: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder II–80

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

10array ≡

pointer

920

h

a

l

l

o➎

buffer ≡

bptr •

\0

"hallo" ≡ h a l l o \0

ziel •

quelle •

Fomale Parameterder Funktion strcpy

Page 81: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder II–81

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;➑ *pointer = 700;

➒ array++;

10array ≡

pointer

920 700

h

a

l

l

o

buffer ≡

bptr •

\0

➑➒

Page 82: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.3 Mehrdimensionale Felder II–82

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.3 Mehrdimensionale Felder

■ neben eindimensionalen Felder kann man auch mehrdimensionale Feldervereinbaren

■ Definition eines mehrdimensionalen Feldes

■ Beispiel:int matrix[4][4];

■ Realisierung:

➤ in der internen Speicherung werden die Feldelemente zeilenweisehintereinander im Speicher abgelegt

➤ Felddefinition: int f[2][2];Ablage der Elemente: f[0][0], f[0][1], f[1][0], f[1][1]f ist ein Zeiger auf f[0][0]

Typ Name [ ] Initialisierung ;Größe

Page 83: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.4 Zugriffe auf Feldelemente bei mehrdim. Feldern II–83

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.4 Zugriffe auf Feldelemente bei mehrdim. Feldern

■ Indizierung:

wobei: 0 <= Ai < Größe der Dimension i des Feldesn = Anzahl der Dimensionen des Feldes

■ Beispiel:

int feld[5][8];feld[2][3] = 10;

■ ist äquivalent zu:

int feld[5][8];int *f1;f1 = (int*)feld;f1[2*8 + 3] = 10;oder*(f1 + (2*8 + 3)) = 10;

[Feldname A1 ] [ An ]

Page 84: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 10 Zeiger und Felder | 10.5 Initialisierung eines mehrdimensionalen Feldes II–84

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.5 Initialisierung eines mehrdimensionalen Feldes

■ ein mehrdimensionales Feld kann - wie ein eindimensionales Feld - durcheine Liste von konstanten Werten, die durch Komma getrennt sind,initialisiert werden

■ wird die explizite Felddimensionierung weggelassen, so bestimmt die Zahlder Initialisierungskonstanten die Größe des Feldes

■ Beispiel:

int feld[3][4] = {{ 1, 3, 5, 7}, /* feld[0][0-3] */{ 2, 4, 6 } /* feld[1][0-2] */

};feld[1][3] und feld[2][0-3] werden in dem Beispiel mit 0 initialisiert!

Page 85: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 11 DynamischeSpeicherverwaltung II–85

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

11 Dynamische Speicherverwaltung

■ Felder können nur mit statischer Größe definiert werden– mit Ausnahme lokaler Felder mit dynamischer (auto) Lebensdauer

■ Wird die Größe eines Feldes erst zur Laufzeit des Programms bekannt, kannder benötigte Speicherbereich dynamisch vom Betriebssystem angefordertwerden: Funktion malloc

➤ Ergebnis: Zeiger auf den Anfang des Speicherbereichs

➤ Zeiger kann danach wie ein Feld verwendet werden ( []-Operator)

■ void *malloc(size_t size)

int *feld;int groesse;...feld = malloc(groesse * sizeof(*feld));if (feld == NULL) {

perror("malloc feld");exit(1);

}for (i=0; i<groesse; i++) { feld[i] = 8; }...

sizeof-Operatorliefert die Größedes Typs desArguments

Fehlerbehandlunghier unbedingtnotwendig!

Page 86: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 11 DynamischeSpeicherverwaltung II–86

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

11 Dynamische Speicherverwaltung (2)

■ Dynamisch angeforderte Speicherbereiche können mit der free-Funktionwieder freigegeben werden

■ void free(void *ptr)

■ die Schnittstellen der Funktionen sind in in der include-Datei stdlib.h definiert#include <stdlib.h>

double *dfeld;int groesse;...dfeld = malloc(groesse * sizeof(*dfeld));...free(dfeld);

Page 87: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 12 sizeof-Operator II–87

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

12 sizeof-Operator

■ In manchen Fällen ist es notwendig, die Größe (in Bytes) einer Variablenoder Struktur zu ermitteln

➤ z. B. zum Anfordern von Speicher für ein Feld (→ malloc)

■ Syntax:

■ Das Ergebnis ist vom Typ size_t(#include <stddef.h>!)

■ Beispiel:

sizeof x liefert die Größe des Objekts x in Bytes

sizeof (Typ) liefert die Größe eines Objekts vom Typ Typ in Bytes

int a; size_t b;b = sizeof a; /* ⇒ b = 2 oder b = 4 */b = sizeof(a); /* alternative Schreibweise */b = sizeof(double); /* ⇒ b = 8 */

Page 88: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 13 ExpliziteTypumwandlung—Cast-Operator II–88

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

13 Explizite Typumwandlung — Cast-Operator

■ C enthält Regeln für eine automatische Konvertierung unterschiedlicherTypen in einem Ausdruck

■ In manchen Fällen wird eine explizite Typumwandlung benötigt(vor allem zur Umwandlung von Zeigern)

■ Syntax: Beispiele:

■ Beispiel:

int i = 5;float f = 0.2;double d;

d = i * f;

→float

→doubleBeispiel:

(Typ) Variable (int) a(float) b

(int *) a(char *) a

feld = (int *) malloc(groesse * sizeof(int));

malloc liefert Ergebnis vom Typ (void *)

cast-Operator macht daraus explizit den Typ (int *)

Page 89: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 14 EindimensionaleFelderalsFunktionsparameter II–89

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

14 Eindimensionale Felder als Funktionsparameter

■ ganze Felder können in C nicht by-value übergeben werden

■ wird einer Funktion ein Feldname als Parameter übergeben, wird damit derZeiger auf das erste Element "by value" übergeben

➥ die Funktion kann über den formalen Parameter (=Kopie des Zeigers) ingleicher Weise wie der Aufrufer auf die Feldelemente zugreifen (unddiese verändern!)

■ bei der Deklaration des formalen Parameters wird die Feldgrößeweggelassen

➤ die Feldgröße ist automatisch durch den tatsächlichen Parameter gegeben

➤ die Funktion kennt die Feldgröße damit nicht

➤ ggf. ist die Feldgröße über einen weiteren int-Parameter der Funktionexplizit mitzuteilen

➤ die Länge von Zeichenketten in char-Feldern kann normalerweise durchSuche nach dem \0-Zeichen bestimmt werden

Page 90: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 14 EindimensionaleFelderalsFunktionsparameter II–90

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

14 Eindimensionale Felder als Funktionsparameter (2)

■ wird ein Feldparameter als const deklariert, können die Feldelementeinnerhalb der Funktion nicht verändert werden

■ Funktionsaufruf und Deklaration der formalen Parameter am Beispiel einesint-Feldes:

■ die Parameter-Deklarationen int p2[] und int *p2sind vollkommen äquivalent!

➤ im Unterschied zu einer Variablendefinitionint f[] = {1, 2, 3}; // initialisiertes Feld mit 3 Elementenint f1[]; // ohne Initialisierung oder Dimension nicht erlaubt!int *p; // Zeiger auf einen int

int a, b;int feld[20];func(a, feld, b);…int func(int p1, int p2[], int p3);oder:int func(int p1, int *p2, int p3);

Page 91: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 14 EindimensionaleFelderalsFunktionsparameter II–91

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

14 Eindimensionale Felder als Funktionsparameter (3)

■ Beispiel 1: Bestimmung der Länge einer Zeichenkette (String)

int strlen(const char string[]){

int i=0;while (string[i] != ’\0’) ++i;return(i);

}

Page 92: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 14 EindimensionaleFelderalsFunktionsparameter II–92

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

14 Eindimensionale Felder als Funktionsparameter (4)

■ Beispiel 2: Konkateniere Strings

■ Funktionsaufruf mit Feld-Parametern

➤ als tatsächlicher Parameter beim Funktionsaufruf wird einfach der Feldnameangegeben

'

void strcat(char to[], const char from[]){

int i=0, j=0;while (to[i] != ’\0’) i++;while ( (to[i++] = from[j++]) != ’\0’ )

;}

char s1[50] = "text1";char s2[] = "text2";strcat(s1, s2); /* ➞ s1= "text1text2" */strcat(s1, "text3");/* ➞ s1= "text1text2text3" */

Page 93: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 15 Zeiger,FelderundZeichenketten II–93

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

p •

/* 1. Version */int strlen(const char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=0

x •

n=5n=4

/* 2. Version */int strlen(const char *s){

char *p = s;while (*p != ’\0’)

p++;return(p-s);

}

o \0h a l

s •

l

x •

s++

p++

Page 94: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 15 Zeiger,FelderundZeichenketten II–94

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten (2)

■ wird eine Zeichenkette zur Initialisierung eines char–Feldes verwendet, istder Feldname ein konstanter Zeiger auf den Anfang der Zeichenkette

char amessage[] = "now is the time";

i sn o w _ _ t_ t h e i m e \0

•amessage ≡

Page 95: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 15 Zeiger,FelderundZeichenketten II–95

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten (3)

■ wird eine Zeichenkette zur Initialisierung eines char–Zeigers verwendet, istder Zeiger eine Variable, die mit der Anfangsadresse der Zeichenketteinitialisiert wird

➥ wird dieser Zeiger überschrieben, ist die Zeichenkette nicht mehradressierbar!

pmessage •

o _h e l l d \0w o r l

pmessage++; ➋printf("%s", pmessage); /*gibt "ello world" aus*/

➊ ➋

char *pmessage = "hello world";

pmessage •

o _h e l l d \0w o r l

o \0h a l l

➌ pmessage = "hallo";

Page 96: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 15 Zeiger,FelderundZeichenketten II–96

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten (4)

■ die Zuweisung eines char–Zeigers oder einer Zeichenkette an einenchar–Zeiger bewirkt kein Kopieren von Zeichenketten!

■ wird eine Zeichenkette als tatsächlicher Parameter an eine Funktionübergeben, erhält diese eine Kopie des Zeigers

pmessage = amessage;

i sn o w _ _ t_ t h e i m e \0

•amessage ≡

pmessage •

weist dem Zeiger pmessage lediglich die Adresse derZeichenkette "now is the time" zu

Page 97: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 15 Zeiger,FelderundZeichenketten II–97

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten (5)

■ Zeichenketten kopieren

/* 1. Version */void strcpy(char to[], const char from[]){

int i=0;while ( (to[i] = from[i]) != ’\0’ )

i++;}

/* 2. Version */void strcpy(char *to, const char *from){

while ( (*to = *from) != ’\0’ )to++, from++;

}

/* 3. Version */void strcpy(char *to, const char *from){

while ( *to++ = *from++ );

}

Page 98: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 15 Zeiger,FelderundZeichenketten II–98

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten (6)

■ in ANSI-C können Zeichenketten in nicht-modifizierbaren Speicherbereichenangelegt werden (je nach Compiler)

➥ Schreiben in Zeichenketten(Zuweisungen über dereferenzierte Zeiger)kann zu Programmabstürzen führen!

• Beispiel:

strcpy("zu ueberschreiben", "reinschreiben");

'

pmessage •

o _h e l l d \0w x o r l

pmessage[6] = ’x’; ➊

char *pmessage = "hello world";

char amessage[] = "hello world";amessage[6] = ’x’;aber! ok!

Page 99: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 16 FeldervonZeigern II–99

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i; ➋

j = *pfeld[3]; ➍

pfeld ≡

i 1➍

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

•➋ ➋■ Zugriffe auf einen Zeiger des

Feldes

➊ pfeld[3]

➌ *pfeld[3]

Page 100: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 16 FeldervonZeigern II–100

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern (2)

■ Beispiel: Definition und Initialisierung eines Zeigerfeldes:

char *month_name(int n){

static char *Monatsnamen[] = {"Unzulaessiger Monat","Januar",

..."Dezember"

};

return ( (n<0 || n>12) ?Monatsnamen[0] : Monatsnamen[n] );

}

•Monatsnamen ≡•

lU n z u t \0M o n a

a rJ a n u \0

u aF e b r r \0

z \0M a e r

m bD e z e e r \0

Page 101: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 17 ArgumenteausderKommandozeile II–101

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17 Argumente aus der Kommandozeile

■ beim Aufruf eines Kommandos können normalerweise Argumenteübergeben werden

■ der Zugriff auf diese Argumente wird der Funktion main( ) durch zweiAufrufparameter ermöglicht:

■ der Parameter argc enthält die Anzahl der Argumente, mit denen dasProgramm aufgerufen wurde

■ der Parameter argv ist ein Feld von Zeiger auf die einzelnen Argumente(Zeichenketten)

■ der Kommandoname wird als erstes Argument übergeben (argv[0])

intmain (int argc, char *argv[]){

…}

intmain (int argc, char **argv){

…}

oder

Page 102: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 17 Argumente aus der Kommandozeile | 17.1 Datenaufbau II–102

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 17.1 Datenaufbau

•argv

argc 5

NULL

c c \0

Kommando: cc -Aa -o auf9 auf9.c

Datei cc.c: ...main(int argc, char *argv[]) {...

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argv[1]

*argv[1] oder argv[1][0]

argv[3][1]

Page 103: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II)17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Ar-gumente (1)

II–103

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus(außer dem Kommandonamen)

'

intmain (int argc, char *argv[]){ int i;

for ( i=1; i<argc; i++) {printf("%s%c", argv[i],

(i < argc-1) ? ’ ’:’\n’ );}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argv[1]

argv[2]

argv[3]

argv[4]

argv[5]

argc 5

1. Version

Page 104: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II)17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Ar-gumente (1)

II–104

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 5 4321 0

2. Version

*argvnach 1x argv++

*argvnach 4x argv++

linksseitiger Operator:erst dekrementieren,dann while-Bedingung prüfen→ Schleife läuft für argc=4,3,2,1

intmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

Page 105: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 18 ZeigeraufZeiger II–105

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

18 Zeiger auf Zeiger

■ ein Zeiger kann auf eine Variable verweisen, die ihrerseits ein Zeiger ist

➤ wird vor allem bei der Parameterübergabe an Funktionen benötigt, wenn einZeiger "call bei reference" übergeben werden muss(z. B. swap-Funktion für Zeiger)

int x = 5;int *ip = &x;

int **ipp = &ip;/* → **ipp = 5 */

x 5

ip

ipp

Page 106: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 19 Strukturen II–106

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

19 Strukturen

■ Beispiele

■ Initialisierung

■ Strukturen als Funktionsparameter

■ Felder von Strukturen

■ Zeiger auf Strukturen

struct student {char nachname[25];char vorname[25];char gebdatum[11];int matrnr;short gruppe;char best;

};

struct komplex {double re;double im;

};

Page 107: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 19 Strukturen | 19.1 Initialisieren von Strukturen II–107

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 19.1 Initialisieren von Strukturen

■ Strukturen können — wie Variablen und Felder — bei der Definitioninitialisiert werden

➤ die Zuordnung zu den Komponenten erfolgt entweder aufgrund derReihenfolge oder aufgrund des angegebenen Namens(in C++ nur aufgrund der Reihenfolge möglich!)

➤ ungenannte Komponenten werden mit 0 initialisiert

■ Beispiele

!!! Vorsichtbei Zugriffen auf eine Struktur werden die Komponenten immer durch dieKomponentennamen identifiziert,bei der Initialisierung nach Reihenfolge aber nur durch die Position

➥ potentielle Fehlerquelle bei Änderungen der Strukturtyp-Deklaration

struct student stud1 = {"Meier", "Hans", "24.01.1970", 1533180, 5, ’n’

};

struct komplex c1 = {1.2, 0.8}, c2 = {.re=0.5, .im=0.33};

Page 108: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 19 Strukturen | 19.2 Strukturen als Funktionsparameter II–108

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 19.2 Strukturen als Funktionsparameter

■ Strukturen können wie normale Variablen an Funktionen übergeben werden

■ Übergabesemantik: call by value

➤ Funktion erhält eine Kopie der Struktur

➤ auch wenn die Struktur ein Feld enthält, wird dieses komplett kopiert!

!!! Unterschied zur direkten Übergabe eines Feldes

■ Strukturen können auch Ergebnis einer Funktion sein

➤ Möglichkeit mehrere Werte im Rückgabeparameter zu transportieren

■ Beispiel

struct komplex komp_add(struct komplex x, struct komplex y) {struct komplex ergebnis = {

.re = x.re + y.re,

.im = x.im + y.im,};return ergebnis;

}

Page 109: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 19 Strukturen | 19.3 Felder von Strukturen II–109

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 19.3 Felder von Strukturen

■ Von Strukturen können — wie von normalen Datentypen — Felder gebildetwerden

■ Beispiel

struct student gruppe8[35];int i;for (i=0; i<35; i++) {

printf("Nachname %d. Stud.: ", i);scanf("%s", gruppe8[i].nachname);…gruppe8[i].gruppe = 8;

if (gruppe8[i].matrnr < 1500000) {gruppe8[i].best = ’y’;

} else {gruppe8[i].best = ’n’;

}}

Page 110: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 19 Strukturen | 19.4 Zeiger auf Felder von Strukturen II–110

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 19.4 Zeiger auf Felder von Strukturen

■ Ergebnis der Addition/Subtraktion abhängig von Zeigertyp!

■ Beispiel

struct student gruppe8[35];struct student *gp1, *gp2;

gp1 = gruppe8; /* gp1 zeigt auf erstes Element des Arrays */printf("Nachname des ersten Studenten: %s", gp1->nachname);

gp2 = gp1 + 1; /* gp2 zeigt auf zweites Element des Arrays */printf("Nachname des zweiten Studenten: %s", gp2->nachname);

printf("Byte-Differenz: %d", (char*)gp2 - (char*)gp1);

Page 111: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 19 Strukturen | 19.5 Zusammenfassung II–111

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 19.5 Zusammenfassung

■ Struktur

■ Zeiger auf Struktur

■ Feld von Strukturen

int a;struct s{int a; char c;}; struct s s1 = {2, ’a’};

s1 2a

int a; struct s *sp = &s1;

s1 2a•sp

struct s sa[3];

sa ≡ •

■ Variable

■ Zeiger

■ Feld

■ Feld von Zeigern

int a; int a;a 5

int a; int *p = &a;a 5

•p

int a; int a[3];a ≡ •

int a; int *p[3];p ≡ ••

••

Page 112: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 20 ZeigeraufFunktionen II–112

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

20 Zeiger auf Funktionen

■ Datentyp: Zeiger auf Funktion

■ Variablendef.: <Rückgabetyp> (*<Variablenname>)(<Parameter>);

int (*fptr)(int, char*);

int test1(int a, char *s) { printf("1: %d %s\n", a, s); }int test2(int a, char *s) { printf("2: %d %s\n", a, s); }

fptr = test1;

fptr(42,"hallo");

fptr = test2;

fptr(42,"hallo");

Page 113: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe II–113

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21 Ein-/Ausgabe

■ E-/A-Funktionalität nicht Teil der Programmiersprache

■ Realisierung durch "normale" Funktionen

➤ Bestandteil der Standard-Funktionsbibliothek

➤ einfache Programmierschnittstelle

➤ effizient

➤ portabel

➤ betriebssystemnah

■ Funktionsumfang

➤ Öffnen/Schließen von Dateien

➤ Lesen/Schreiben von Zeichen, Zeilen oder beliebigen Datenblöcken

➤ Formatierte Ein-/Ausgabe

Page 114: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.1 Standard Ein-/Ausgabe II–114

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 21.1 Standard Ein-/Ausgabe

■ Jedes C-Programm erhält beim Start automatisch 3 E-/A-Kanäle:

■ stdin Standardeingabe

➤ normalerweise mit der Tastatur verbunden

➤ Dateiende (EOF) wird durch Eingabe von CTRL-D am Zeilenanfangsignalisiert

➤ bei Programmaufruf in der Shell auf Datei umlenkbarprog <eingabedatei

( bei Erreichen des Dateiendes wird EOF signalisiert )

■ stdout Standardausgabe

➤ normalerweise mit dem Bildschirm (bzw. dem Fenster, in dem dasProgramm gestartet wurde) verbunden

➤ bei Programmaufruf in der Shell auf Datei umlenkbarprog >ausgabedatei

■ stderr Ausgabekanal für Fehlermeldungen

➤ normalerweise ebenfalls mit Bildschirm verbunden

Page 115: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.1 Standard Ein-/Ausgabe II–115

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.1 Standard Ein-/Ausgabe (2)

■ Pipes

■ die Standardausgabe eines Programms kann mit der Standardeingabe einesanderen Programms verbunden werden

➤ Aufrufprog1 | prog2

! Die Umlenkung von Standard-E/A-Kanäle ist für die aufgerufenenProgramme völlig unsichtbar

■ automatische Pufferung

■ Eingabe von der Tastatur wird normalerweise vom Betriebssystem zeilenweisezwischengespeichert und erst bei einem Newline-Zeichen (’\n’) an dasProgramm übergeben!

Page 116: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.2 Öffnen und Schließen von Dateien II–116

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 21.2 Öffnen und Schließen von Dateien

■ Neben den Standard-E/A-Kanälen kann ein Programm selbst weitereE/A-Kanäle öffnen

➤ Zugriff auf Dateien

■ Öffnen eines E/A-Kanals

➤ Funktion fopen:

name Pfadname der zu öffnenden Datei

mode Art, wie die Datei geöffnet werden soll"r" zum Lesen"w" zum Schreiben"a" append: Öffnen zum Schreiben am Dateiende"rw" zum Lesen und Schreiben

➤ Ergebnis von fopen:Zeiger auf einen Datentyp FILE, der einen Dateikanal beschreibtim Fehlerfall wird ein NULL-Zeiger geliefert

#include <stdio.h>FILE *fopen(char *name, char *mode);

Page 117: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.2 Öffnen und Schließen von Dateien II–117

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.2 Öffnen und Schließen von Dateien (2)

■ Beispiel:

■ Schließen eines E/A-Kanals

➤ schließt E/A-Kanal fp

➤ Fehlerbehandlung wichtig (z. B. letztes Schreiben des Puffers schlägt fehl)

int main(int argc, char *argv[]) {FILE *eingabe;

if (argv[1] == NULL) {fprintf(stderr, "keine Eingabedatei angegeben\n");exit(1); /* Programm abbrechen */

}eingabe = fopen(argv[1], "r");if (eingabe == NULL) {

/* eingabe konnte nicht geoeffnet werden */perror(argv[1]); /* Fehlermeldung ausgeben */exit(1); /* Programm abbrechen */

}

... /* Programm kann jetzt von eingabe lesen */

int fclose(FILE *fp)

Page 118: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.3 Zeichenweise Lesen und Schreiben II–118

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 21.3 Zeichenweise Lesen und Schreiben

■ Lesen eines einzelnen Zeichens

➤ lesen das nächste Zeichen

➤ geben das gelesene Zeichen als int-Wert zurück

➤ geben bei Eingabe von CTRL-D bzw. am Ende der Datei EOF als Ergebniszurück

■ Schreiben eines einzelnen Zeichens

➤ schreiben das im Parameter c übergeben Zeichen

➤ geben gleichzeitig das geschriebene Zeichen als Ergebnis zurück

int getchar( )

■ von der Standardeingabe ■ von einem Dateikanal

int getc(FILE *fp )

int putchar(int c)

■ auf die Standardausgabe ■ auf einen Dateikanal

int putc(int c, FILE *fp )

Page 119: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.3 Zeichenweise Lesen und Schreiben II–119

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.3 Zeichenweise Lesen und Schreiben (2)

■ Beispiel: copy-Programm, Aufruf: copy Quelldatei Zieldatei#include <stdio.h>

int main(int argc, char *argv[]) {FILE *quelle, *ziel;

if (argc < 3) { /* Fehlermeldung, Abbruch */ }

if ((quelle = fopen(argv[1], "r")) == NULL) { perror(argv[1]);/* Fehlermeldung ausgeben */ exit(EXIT_FAILURE);/* Programm abbrechen */}

if ((ziel = fopen(argv[2], "w")) == NULL) { /* Fehlermeldung, Abbruch */}

int c; /* gerade kopiertes Zeichen */while ( (c = getc(quelle)) != EOF ) {

if (putc(c, ziel) == EOF) { /* Fehlerbehandlung */ }}if (ferror(quelle)) { /* Fehlerbehandlung */ }

fclose(quelle); /* Fehler hier irrelevant, nur gelesen */if (fclose(ziel)) { /* Fehlerbehandlung */ }

}

Page 120: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.3 Zeichenweise Lesen und Schreiben II–120

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.3 Zeilenweise Lesen und Schreiben

■ Lesen einer Zeile von der Standardeingabe

➤ liest Zeichen von Dateikanal fp in das Feld s bis entweder n-1 Zeichengelesen wurden oder ’\n’ oder EOF gelesen wurde

➤ s wird mit ’\0’ abgeschlossen (’\n’ wird nicht entfernt)

➤ gibt bei EOF oder Fehler NULL zurück, sonst s

➤ für fp kann stdin eingesetzt werden, um von der Standardeingabe zu lesen

■ Schreiben einer Zeile

➤ schreibt die Zeichen im Feld s auf Dateikanal fp

➤ für fp kann auch stdout oder stderr eingesetzt werden

➤ als Ergebnis wird die Anzahl der geschriebenen Zeichen geliefert

char *fgets(char *s, int n, FILE *fp)

int fputs(char *s, FILE *fp)

Page 121: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.4 Formatierte Ausgabe II–121

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 21.4 Formatierte Ausgabe

■ Bibliotheksfunktionen — Prototypen (Schnittstelle)

■ Die statt ... angegebenen Parameter werden entsprechend der Angaben imformat-String ausgegeben

➤ bei printf auf der Standardausgabe

➤ bei fprintf auf dem Dateikanal fp(für fp kann auch stdout oder stderr eingesetzt werden)

➤ sprintf schreibt die Ausgabe in das char-Feld s(achtet dabei aber nicht auf das Feldende -> Pufferüberlauf möglich!)

➤ snprintf arbeitet analog, schreibt aber maximal nur n Zeichen(n sollte natürlich nicht größer als die Feldgröße sein)

int printf(char *format, /* Parameter */ ... ); int fprintf(FILE *fp, char *format, /* Parameter */ ... ); int sprintf(char *s, char *format, /* Parameter */ ...);int snprintf(char *s, int n, char *format, /* Parameter */ ...);

Page 122: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.4 Formatierte Ausgabe II–122

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.4 Formatierte Ausgabe (2)

■ Zeichen im format-String können verschiedene Bedeutung haben

➤ normale Zeichen: werden einfach auf die Ausgabe kopiert

➤ Escape-Zeichen: z. B. \n oder \t, werden durch dieentsprechenden Zeichen (hier Zeilenvorschubbzw. Tabulator) bei der Ausgabe ersetzt

➤ Format-Anweisungen: beginnen mit %-Zeichen und beschreiben, wie derdazugehörige Parameter in der Liste nach demformat-String aufbereitet werden soll

■ Format-Anweisungen%d, %i int Parameter als Dezimalzahl ausgeben

%f float Parameter wird als Fließkommazahl(z. B. 271.456789) ausgegeben

%e float Parameter wird als Fließkommazahlin 10er-Potenz-Schreibweise (z. B. 2.714567e+02) ausgegeben

%c char-Parameter wird als einzelnes Zeichen ausgegeben

%s char-Feld wird ausgegeben, bis ’\0’ erreicht ist

Page 123: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.5 Formatierte Eingabe II–123

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 21.5 Formatierte Eingabe

■ Bibliotheksfunktionen — Prototypen (Schnittstelle)

■ Die Funktionen lesen Zeichen von stdin (scanf), fp (fscanf) bzw. ausdem char-Feld s.

■ format gibt an, welche Daten hiervon extrahiert und in welchen Datentypkonvertiert werden sollen

■ Die folgenden Parameter sind Zeiger auf Variablen der passendenDatentypen (bzw. char-Felder bei Format %s), in die die Resultateeingetragen werden

■ relativ komplexe Funktionalität, hier nur Kurzüberblickfür Details siehe Manual-Seiten

int scanf(char *format, /* Parameter */ ...); int fscanf(FILE *fp, char *format, /* Parameter */ ...); int sscanf(char *s, const char *format, /* Parameter */ ...);

Page 124: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.5 Formatierte Eingabe II–124

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.5 Formatierte Eingabe (2)

■ White space (Space, Tabulator oder Newline \n) bildet jeweils die Grenzezwischen Daten, die interpretiert werden

➤ white space wird in beliebiger Menge einfach überlesen

➤ Ausnahme: bei Format-Anweisung %c wird auch white space eingelesen

■ Alle anderen Daten in der Eingabe müssen zum format-String passen oderdie Interpretation der Eingabe wird abgebrochen

➤ wenn im format-String normale Zeichen angegeben sind, müssen diese exaktso in der Eingabe auftauchen

➤ wenn im Format-String eine Format-Anweisung (%...) angegeben ist, muss inder Eingabe etwas hierauf passendes auftauchen

➥ diese Daten werden dann in den entsprechenden Typ konvertiert undüber den zugehörigen Zeiger-Parameter der Variablen zugewiesen

■ Die scanf-Funktionen liefern als Ergebnis die Zahl der erfolgreich an dieParameter zugewiesenen Werte

Page 125: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.5 Formatierte Eingabe II–125

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

21.5 Formatierte Eingabe (3)

■ nach % kann eine Zahl folgen, die diemaximale Feldbreite angibt

%3d = 3 Ziffern lesen

%5c = 5 char lesen (Parameter mussdann Zeiger auf char-Feld sein)

➤ %5c überträgt exakt 5 char (hängt aberkein ’\0’ an!)

➤ %5s liest max. 5 char (bis white space)und hängt ’\0’ an

■ Beispiele:

int a, b, c, d, n;char s1[20]="XXXXXX", s2[20];n = scanf("%d %2d %3d %5c %19s %d", &a, &b, &c, s1, s2, &d);

Eingabe: 12 1234567 sowas hmmErgebnis: n=5, a=12, b=12, c=345

s1="67 soX", s2="was"

%d int

%hd short

%ld long int

%lld long long int

%f float

%lf double

%Lf long double

analog auch %e oder %g

%c char

%s String, wirdautomatisch mit’\0’ abgeschl.

Page 126: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2020, A-II) 21 Ein-/Ausgabe | 21.6 Fehlerbehandlung II–126

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 21.6 Fehlerbehandlung

■ Fast jeder Systemcall/Bibliotheksaufruf kann fehlschlagen

■ Fehlerbehandlung unumgänglich!

■ Vorgehensweise:

■ Rückgabewerte von Systemcalls/Bibliotheksaufrufen abfragen

■ Im Fehlerfall (meist durch Rückgabewert -1 angezeigt):Fehlercode steht in der globalen Variable errno

■ Fehlermeldung kann mit der Funktion perror auf die Fehlerausgabeausgegeben werden:

void perror(const char *s);

Page 127: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

SystemprogrammierungGrundlage von Betriebssystemen

IIITeil A – III. Vom C-Programm zum laufenden Prozess

9. Mai 2019

Page 128: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 1 Überblick III–2

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

1 Überblick

■ Vom C-Programm zum ausführbaren Programm (Executable)

➤ Präprozessor

➤ Compilieren

➤ (Assemblieren)

➤ Binden (statisch / dynamisch)

■ Programme und Prozesse

➤ Speicherorganisation eines Programms

➤ Speicherorganisation eines Prozesses

➤ Laden eines Programms (statisch gebunden / dynamisch gebunden)

■ Prozesse

➤ Prozesszustände

➤ Prozesse erzeugen

➤ Programme ausführen

➤ weitere Operationen auf Prozessen

Page 129: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 2 Übersetzen - Objektmodule III–3

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

2 Übersetzen - Objektmodule

■ 1. Schritt: Präprozessor

■ entfernt Kommentare, wertet Präprozessoranweisungen aus

➤ fügt include-Dateien ein

➤ expandiert Makros

➤ entfernt Makro-abhängige Code-Abschnitte (conditional code)Beispiel:

■ Zwischenergebnis kann mit cc -P datei.c als datei.i erzeugt werden odermit cc -E datei.c ausgegeben werden

#define DEBUG...#ifdef DEBUG

printf("Zwischenergebnis = %d\n", wert);#endif DEBUG

Page 130: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 2 Übersetzen - Objektmodule III–4

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

2 Übersetzen - Objektmodule (2)

■ 2. Schritt: Compilieren

■ übersetzt C-Code in Assembler

■ wenn Assemblercode nicht explizit angefordert wird, direkter Übergang zu 3.

■ Zwischenergebnis kann mit cc -S datei.c als datei.s erzeugt werden

■ 3. Schritt: Assemblieren

■ assembliert Assembler-Code, erzeugt Maschinencode (Objekt-Datei)

■ standardisiertes Objekt-Dateifomat: ELF (Executable and Linking Format)(vereinfachte Darstellung) - in nicht-UNIX-Systemen andere Formate

➤ Maschinencode

➤ Informationen über Variablen mit Lebensdauer static(ggf. Initialisierungswerte)

➤ Symboltabelle: wo stehen welche globale Variablen und Funktionen

➤ Relokierungsinformation: wo werden welche "nicht gefundenen"globalen Variablen bzw. Funktionen referenziert

■ Zwischenergebnis kann mit cc -c datei.c als datei.o erzeugt werden

Page 131: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 3 Binden und Bibliotheken III–5

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

3 Binden und Bibliotheken

■ 4. Schritt: Binden

■ Programm ld : ( linker ), erzeugt ausführbare Datei ( executable file )

➤ ebenfalls ELF-Format (früher a.out-Format oder COFF)

■ Objekt-Dateien (.o-Dateien) werden zusammengebunden

➤ noch nicht abgesättigte Referenzen auf globale Variablen undFunktionen in anderen Objekt-Dateien werden gebunden (Relokation)

■ nach fehlenden Funktionen wird in Bibliotheken gesucht

Page 132: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 3 Binden und Bibliotheken III–6

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

3 Binden und Bibliotheken (2)

■ statisch binden

■ alle fehlenden Funktionen werden aus Bibliotheken genommen und in dieausführbare Datei einkopiert

➤ ausführbare Datei ggf. sehr groß

➤ Funktionen die in vielen Programmen benötigt werden (z. B. printf)werden überall einkopiert

■ dynamisch binden

■ Funktionen aus gemeinsam nutzbaren Bibliotheken (shared libraries) werdennicht in die ausführbare Datei einkopiert

➤ ausführbare Datei enthält weiterhin nicht-relokierte Referenzen

➤ ausführbare Dateien sind kleiner, mehrfach genutzte Funktionen sind nureinmal in der shared library abgelegt

➤ Relokation erfolgt beim Laden

Page 133: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 4 Programme und Prozesse III–7

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

4 Programme und Prozesse

■ Programm: Folge von Anweisungen(hinterlegt beispielsweise als ausführbare Datei auf demHintergrundspeicher)

■ Prozess: Programm, das sich in Ausführung befindet, und seine Daten(Beachte: ein Programm kann sich mehrfach in Ausführung befinden)

➤ ein Prozess ist erst mal ein abstraktes Gebilde (= Funktionen undDatenstrukturen zur Verwaltung von Programmausführungen)

➤ im objektorientierten Sinn eine Klasse

■ Prozessinstanz (Prozessinkarnation):eine physische Instanz des abstrakten Gebildes "Prozess"

➤ eine konkrete Ausführungsumgebung für ein Programm(Speicher, Rechte, Verwaltungsinformation)

➤ im objektorientierten Sinn die Instanz

■ Sprachgebrauch in der Praxis etwas schlampig:mit "Prozess" wird meistens eine Prozessinstanz gemeint

Page 134: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 4 Programme und Prozesse | 4.1 Speicherorganisation eines Programms III–8

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.1 Speicherorganisation eines Programms

■ definiert durch das ELF-Format

■ wichtigste Elemente (stark vereinfach dargestellt)

ELF header

...

text

initialized data

symbol table

ELF header Identifikator undVerwaltungsinformationen (z. B.verschiedene executable Formatemöglich)

text Programmkode

initialized data initialisierte globale und staticVariablen

symbol table Zuordnung der im Programmverwendeten symbolischen Namenvon Funktionen und globalenVariablen zu Adressen(z. B. für Debugger)

...

Page 135: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 4 Programme und Prozesse | 4.2 Speicherorganisation eines Prozesses III–9

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 4.2 Speicherorganisation eines Prozesses

ELF-header

...

text

initialized data

symbol table

bss nicht initialisierte globale und staticVariablen (wird vor der Vergabe anden Prozess mit 0 vorbelegt)

heap dynamische Erweiterungen desbss-Segments (sbrk(2), malloc(3))

stack lokale Variablen,Funktionsparameter,Speicherbereiche für Registerinhalte,(wird bei Bedarf dynamisch erweitert)

text

initialized data

bss

stack

heap

Betriebssystemdaten

data

Page 136: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 5 Laden eines Programms | 4.2 Speicherorganisation eines Prozesses III–10

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

5 Laden eines Programms

■ in eine konkrete Ausführungsumgebung (Prozessinstanz) kann einProgramm geladen werden

➤ Loader

■ Laden statisch gebundener Programme

■ Segmente der ausführbaren Datei werden in den Speicher geladen

➤ abhängig von der jeweiligen Speicherorganisation des Betriebssystems

■ Speicher für nicht-initialisierte globale und static Variablen (bss) wirdbereitgestellt und mit 0 vorbelegt

■ Speicher für lokale Variablen (stack) wird bereitgestellt

■ Aufrufparameter werden in Stack- oder Datensegment kopiert,argc und argv-Zeiger werden entsprechend initialisiert

■ main-Funktion wird angesprungen

Page 137: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 5 Laden eines Programms | 4.2 Speicherorganisation eines Prozesses III–11

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

5 Laden eines Programms (2)

■ Laden dynamisch gebundener Programme

■ spezielles Lade-Programm wird gestartet: ld.so ( dynamic linker/loader )ld.so erledigt die weiteren Aufgaben

➤ Segmente der ausführbaren Datei werden in den Speicher geladen undSpeicher für nicht-initialisierte globale und static Variablen (bss) wird angelegt

➤ fehlende Funktionen werden aus shared libraries geladen (ggf. rekursiv)

➤ noch offene Referenzen werden abgesättigt (Relokation)

➤ wenn notwendig werden Initialisierungsfunktionen der shared librariesaufgerufen (z. B. Klasseninitialisierungen bei C++)

➤ Parameter für main werden bereigestellt

➤ main-Funktion wird angesprungen

➤ bei Bedarf können auch während der Laufzeit des Programms aufAnforderung des Programms weitere Funktionen nachgeladen werden(z. B. für plugins)

Page 138: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.1 Prozesszustände III–12

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

6 Prozesse

| 6.1 Prozesszustände

■ Ein Prozess befindet sich in einem der folgenden Zustände:

■ Erzeugt (New)Prozess wurde erzeugt, besitzt aber noch nicht alle nötigen Betriebsmittel

■ Bereit (Ready)Prozess besitzt alle nötigen Betriebsmittel und ist bereit zum Laufen

■ Laufend (Running)Prozess wird vom realen Prozessor ausgeführt

■ Blockiert (Blocked/Waiting)Prozess wartet auf ein Ereignis (z.B. Fertigstellung einer Ein- oderAusgabeoperation, Zuteilung eines Betriebsmittels, Empfang einer Nachricht);zum Warten wird er blockiert

■ Beendet (Terminated)Prozess ist beendet; einige Betriebsmittel sind aber noch nicht freigegeben oderProzess muss aus anderen Gründen im System verbleiben

Page 139: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.1 Prozesszustände III–13

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

6.1 Prozesszustände (2)

■ Zustandsdiagramm

■ Scheduler ist der Teil des Betriebssystems, der die Zuteilung des realenProzessors vornimmt.

erzeugt beendet

bereit laufend

blockiert

zugelassen

Schedulerteilt Prozessor zu

Unterbrechungimpliziter oderexpliziter Warteaufruf

Grund der Blockadeist weggefallen

terminiert

Nach Silberschatz, 1994 wartend

Page 140: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.2 Prozesserzeugung (UNIX) III–14

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 6.2 Prozesserzeugung (UNIX)

■ Erzeugen eines neuen UNIX-Prozesses

■ Duplizieren des gerade laufenden Prozesses

pid_t fork( void );

pid_t p;...p= fork();if( p == (pid_t)0 ) {

/* child */...

} else if( p!=(pid_t)-1 ) {/* parent */...

} else {/* error */...

}

Elternprozess

Page 141: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.2 Prozesserzeugung (UNIX) III–15

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

6.2 Prozesserzeugung (UNIX)

■ Erzeugen eines neuen UNIX-Prozesses

■ Duplizieren des gerade laufenden Prozesses

pid_t fork( void );

pid_t p;...p= fork();if( p == (pid_t)0 ) {

/* child */...

} else if( p!=(pid_t)-1 ) {/* parent */...

} else {/* error */...

}

pid_t p;...p= fork();if( p == (pid_t)0 ) {

/* child */...

} else if( p!=(pid_t)-1 ) {/* parent */...

} else {/* error */...

}

KindprozessElternprozess

Page 142: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.2 Prozesserzeugung (UNIX) III–16

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

6.2 Prozesserzeugung (2)

■ Der Kindprozess ist eine perfekte Kopie des Elternprozesses

➤ gleiches Programm

➤ gleiche Daten (gleiche Werte in Variablen)

➤ gleicher Programmzähler (nach der Kopie)

➤ gleicher Eigentümer

➤ gleiches aktuelles Verzeichnis

➤ gleiche Dateien geöffnet (selbst Schreib-/Lesezeiger ist gemeinsam)

➤ ...

■ Unterschiede:

➤ verschiedene PIDs

➤ fork() liefert verschiedene Werte als Ergebnis für Eltern- und Kindproz.

Page 143: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.3 Ausführen eines Programms (UNIX) III–17

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 6.3 Ausführen eines Programms (UNIX)

■ Prozess führt ein neues Programm aus

int execve( const char *path, char *const argv[],char *const envp[] );

...execve( "someprogram", argv, envp );...

Prozess A

Page 144: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.3 Ausführen eines Programms (UNIX) III–18

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

6.3 Ausführen eines Programms (UNIX)

■ Prozess führt ein neues Programm aus

int execve( const char *path, char *const argv[],char *const envp[] );

das vorher ausgeführte Programm ist dadurch endgültig beendet

➤ execve kehrt im Erfolgsfall nie zurück

...execve( "someprogram", argv, envp );...

Prozess A

...execve( "someprogram", argv, envp );...

Prozess A

...int main( int argc, char *argv[] ){

...

Prozess A

Page 145: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2019, A-III) 6 Prozesse | 6.4 Operationen auf Prozessen (UNIX) III–19

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 6.4 Operationen auf Prozessen (UNIX)

■ Prozess beenden

void exit( int status );

➤ Prozess terminiert - exit kehrt nicht zurück

■ Prozessidentifikator

pid_t getpid( void ); /* eigene PID */pid_t getppid( void ); /* PID des Elternprozesses */

■ Warten auf Beendigung eines Kindprozesses

pid_t wait( int *statusp );

➤ Prozess wird so lange blockiert bis Kindprozess terminiert

➤ über den Parameter werden Informationen über den exit-Status desKindprozesses zurückgeliefert

Page 146: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 1 IIa–1

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

IIaEinführung in die Programmiersprache C

1

2

3

4

5

6

7

Page 147: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.1 IIa–2

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8 Zeiger(-Variablen)

| 8.1

| 8.2

Page 148: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–3

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

5y

➊ ➋

Page 149: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–4

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

Typ *Name ;

Page 150: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–5

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

5x

?ip

?y

Page 151: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–6

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

5x

ip

?y

?

Page 152: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–7

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

5x

ip

?y

?

Page 153: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–8

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

5x

•ip

?y

Page 154: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–9

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

?y

Page 155: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–10

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

?y

*ip

Page 156: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–11

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

y

Page 157: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–12

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

'

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

5y

Page 158: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.3 Definition von Zeigervariablen IIa–13

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.3 Definition von Zeigervariablen

■ Syntax:

▲ Beispiele

Typ *Name ;

int x = 5;

int *ip;

int y;

ip = &x; ➊

y = *ip; ➋

5x

•ip

5y

➊ ➋

Page 159: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.4 IIa–14

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.4

Page 160: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–15

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.5 Zeiger als Funktionsargumente

Page 161: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–16

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a, b;...swap(&a, &b); ➊...

}

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌*py = tmp; ➍

}

a

px

b

py •

tmp

Page 162: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–17

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

int main() {int a=47, b=11;

47a

b 11

Page 163: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–18

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...

void swap (int *px, int *py){

int tmp;

47a

px

b 11

py •

tmp

Page 164: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–19

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

47a

px

b 11

py •

tmp

Page 165: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–20

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b); ➊

void swap (int *px, int *py){

int tmp;

47a

px

b 11

py •

tmp

Page 166: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–21

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

47a

px

b 11

py •

tmp

Page 167: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–22

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋

47a

px

b 11

py •

tmp

Page 168: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–23

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋

47a

px

b 11

py •

tmp

*px

Page 169: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–24

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋

47a

px

b 11

py •

tmp 47

Page 170: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–25

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌

47a

px

b 11

py •

tmp 47

Page 171: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–26

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌

47a

px

b 11

py •

tmp 47

*px

*py

Page 172: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–27

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌

11a

px

b 11

py •

tmp 47

Page 173: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–28

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌*py = tmp; ➍

}

11a

px

b 11

py •

tmp 47

Page 174: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–29

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

'

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b);

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌*py = tmp; ➍

}

11a

px

b 47

py •

tmp 47

*py

Page 175: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 8 Zeiger(-Variablen) | 8.5 Zeiger als Funktionsargumente IIa–30

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

8.5 … Zeiger als Funktionsargumente (2)

■ Beispiel:

void swap (int *, int *);int main() {

int a=47, b=11;...swap(&a, &b); ➊...

}

void swap (int *px, int *py){

int tmp;

tmp = *px; ➋*px = *py; ➌*py = tmp; ➍

}

a

px

b

py •

tmp

Page 176: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 9 | 8.6 IIa–31

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 8.6

9

Page 177: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–32

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

1➊

• ➍

➌➋

Page 178: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–33

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5]; array ≡ •

Page 179: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–34

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

array ≡

ip •

Page 180: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–35

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;

array ≡

ip •

ep ?

Page 181: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–36

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

array ≡

ip •

ep ?

Page 182: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–37

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

array ≡

ip •

ep •

• •

Page 183: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–38

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

array ≡

ip •

ep •

Page 184: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–39

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

array ≡

ip •

ep •

Page 185: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–40

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

array ≡

ip •

ep • ➌

Page 186: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–41

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

array ≡

ip •

ep •

Page 187: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–42

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

Page 188: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–43

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

*ep

Page 189: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–44

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

'

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

1 ➍

Page 190: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–45

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

1➊

• ➍

➌➋

Page 191: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder IIa–46

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10 Zeiger und Felder

■ ein Feldname ist ein konstanter Zeiger auf das erste Element des Feldes

■ im Gegensatz zu einer Zeigervariablen kann sein Wert nicht verändertwerden

■ es gilt:

int array[5];

int *ip = array; ➊

int *ep;ep = &array[0]; ➋

ep = &array[2]; ➌

*ep = 1; ➍

array ≡

ip •

ep •

1➊

• ➍

➌➋

Page 192: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–47

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

■ +, –Addition und Subtraktion von Zeigernund ganzzahligen Werten.

Dabei wird immer die Größe desObjekttyps berücksichtigt!

!!! Achtung: Assoziativität der Operatoren beachten !!

int array[3];int *ip = array; ➊

ip++; ➋

ip++; ➌

array ≡

ip •

➊➋ ➌

ip •

int array[5];ip = array; ➊

ip = ip+3; ➋

Page 193: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–48

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

int array[3];int *ip = array; ➊

array ≡

ip •

Page 194: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–49

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

int array[3];int *ip = array; ➊

ip++; ➋

array ≡

ip •

Page 195: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–50

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

int array[3];int *ip = array; ➊

ip++; ➋

array ≡

ip •

Page 196: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–51

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

int array[3];int *ip = array; ➊

ip++; ➋

ip++; ➌

array ≡

ip •

Page 197: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–52

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

int array[3];int *ip = array; ➊

ip++; ➋

ip++; ➌

array ≡

ip •

Page 198: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–53

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

Page 199: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–54

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

■ +, –Addition und Subtraktion von Zeigernund ganzzahligen Werten.

Dabei wird immer die Größe desObjekttyps berücksichtigt!

ip •

int array[5];ip = array; ➊

Page 200: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–55

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

■ +, –Addition und Subtraktion von Zeigernund ganzzahligen Werten.

Dabei wird immer die Größe desObjekttyps berücksichtigt!

ip •

int array[5];ip = array; ➊

ip = ip+3; ➋

Page 201: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–56

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

■ +, –Addition und Subtraktion von Zeigernund ganzzahligen Werten.

Dabei wird immer die Größe desObjekttyps berücksichtigt!

'

ip • ➋

int array[5];ip = array; ➊

ip = ip+3; ➋

Page 202: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.1 Arithmetik mit Adressen IIa–57

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.1 Arithmetik mit Adressen

■ ++ -Operator: Inkrement = nächstes Objekt

■ -- -Operator: Dekrement = vorheriges Objekt

■ +, –Addition und Subtraktion von Zeigernund ganzzahligen Werten.

Dabei wird immer die Größe desObjekttyps berücksichtigt!

!!! Achtung: Assoziativität der Operatoren beachten !!

int array[3];int *ip = array; ➊

ip++; ➋

ip++; ➌

array ≡

ip •

➊➋ ➌

ip •

int array[5];ip = array; ➊

ip = ip+3; ➋

Page 203: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–58

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 10.2 Zeigerarithmetik und Felder

Page 204: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–59

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

array ≡

pointer

•buffer ≡

bptr

Page 205: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–60

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;

10array ≡

pointer

920

•buffer ≡

bptr

Page 206: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–61

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");

10array ≡

pointer

920

•buffer ≡

bptr

•"hallo" ≡ h a l l o \0

Page 207: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–62

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");

10array ≡

pointer

920

•buffer ≡

bptrziel •

quelle •

Fomale Parameterder Funktion strcpy

•"hallo" ≡ h a l l o \0

Page 208: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–63

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");

10array ≡

pointer

920

•buffer ≡

bptrziel •

quelle •

Fomale Parameterder Funktion strcpy

➌•"hallo" ≡ h a l l o \0

Page 209: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–64

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");

10array ≡

pointer

920

•buffer ≡

bptrziel •

quelle •

Fomale Parameterder Funktion strcpy

h

a

l

l

o

\0

•"hallo" ≡ h a l l o \0

Page 210: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–65

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

10array ≡

pointer

920

h

a

l

l

o➎

buffer ≡

bptr •

\0

Page 211: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–66

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;

10array ≡

pointer

920

h

a

l

l

o

buffer ≡

bptr •

\0

Page 212: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–67

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;

10array ≡

pointer

920

h

a

l

l

o

buffer ≡

bptr •

\0

Page 213: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–68

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;

10array ≡

pointer

920

h

a

l

l

o

buffer ≡

bptr •

\0

Page 214: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–69

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;

10array ≡

pointer

920

h

a

l

l

o

buffer ≡

bptr •

\0

Page 215: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–70

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;➑ *pointer = 700;

10array ≡

pointer

920 700

h

a

l

l

o

buffer ≡

bptr •

\0

Page 216: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–71

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;➑ *pointer = 700;

➒ array++;

10array ≡

pointer

700

h

a

l

l

o

buffer ≡

bptr •

\0

Page 217: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–72

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;➑ *pointer = 700;

➒ array++;

10array ≡

pointer

700

h

a

l

l

o

buffer ≡

bptr •

\0

'

Page 218: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 10 Zeiger und Felder | 10.2 Zeigerarithmetik und Felder IIa–73

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

10.2 Zeigerarithmetik und Felder

int array[5];int *pointer;char buffer[6];char *bptr;

➊ array[0] = 10;➋ array[1] = 920;➌ strcpy(buffer,"hallo");➍ pointer = array;➎ bptr = buffer;

➏ pointer++;➐ bptr++;➑ *pointer = 700;

➒ array++;

10array ≡

pointer

700

h

a

l

l

o

buffer ≡

bptr •

\0

Page 219: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 11 | 10.2 Zeigerarithmetik und Felder IIa–74

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

11

12

13

14

Page 220: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–75

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

p •

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=0

x •

n=5n=4

/* 2. Version */int strlen(char *s){

char *p = s;while (*p != ’\0’)

p++;return(p-s);

}

o \0h a l

s •

l

x •

s++

p++

Page 221: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–76

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

o \0h a l l

x •

Page 222: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–77

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s

l

x •

Page 223: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–78

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s

l

n=0

Page 224: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–79

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=1

s++

Page 225: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–80

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=2

s++

Page 226: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–81

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=3

s++

Page 227: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–82

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=4

s++

Page 228: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–83

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=5

s++

Page 229: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–84

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

p •

/* 2. Version */int strlen(char *s){

char *p = s;while (*p != ’\0’)

p++;return(p-s);

}

o \0h a l

s •

l

x •

p++

Page 230: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–85

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

'

p •

/* 2. Version */int strlen(char *s){

char *p = s;while (*p != ’\0’)

p++;return(p-s);

}

o \0h a l

s •

l

p++

Page 231: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 15 Zeiger, Felder und Zeichenketten IIa–86

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

15 Zeiger, Felder und Zeichenketten

■ Zeichenketten sind Felder von Einzelzeichen (char), die in der internenDarstellung durch ein ’\0’–Zeichen abgeschlossen sind

■ Beispiel: Länge eines Strings ermitteln — Aufruf strlen(x);

p •

/* 1. Version */int strlen(char *s){

int n;for (n=0; *s != ’\0’; s++)

n++;return(n);

}

o \0h a l

s •

l

n=0

x •

n=5n=4

/* 2. Version */int strlen(char *s){

char *p = s;while (*p != ’\0’)

p++;return(p-s);

}

o \0h a l

s •

l

x •

s++

p++

Page 232: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–87

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i; ➋

j = *pfeld[3]; ➍

pfeld ≡

i 1➍

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

•➋ ➋■ Zugriffe auf einen Zeiger des

Feldes

➊ pfeld[3]

➌ *pfeld[3]

Page 233: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–88

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld ≡

i 1

•■ Deklaration

j

Page 234: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–89

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i;

pfeld ≡

i 1

•■ Deklaration

j

■ Zugriffe auf einen Zeiger desFeldes

➊ pfeld[3]

Page 235: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–90

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i; ➋

pfeld ≡

i 1

■ Deklaration

j

•➋■ Zugriffe auf einen Zeiger des

Feldes

➊ pfeld[3]

Page 236: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–91

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i; ➋

pfeld ≡

i 1

■ Deklaration

j

•➋■ Zugriffe auf einen Zeiger des

Feldes

➊ pfeld[3]

Page 237: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–92

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i;

j = *pfeld[3];

pfeld ≡

i 1

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

■ Zugriffe auf einen Zeiger desFeldes

Page 238: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–93

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i;

j = *pfeld[3];

pfeld ≡

i 1

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

■ Zugriffe auf einen Zeiger desFeldes

➊ pfeld[3]

Page 239: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–94

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i;

j = *pfeld[3];

pfeld ≡

i

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

■ Zugriffe auf einen Zeiger desFeldes

➌ *pfeld[3]

1

Page 240: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–95

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i;

j = *pfeld[3]; ➍

pfeld ≡

i 1➍

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

■ Zugriffe auf einen Zeiger desFeldes

➌➍

➌ *pfeld[3]

Page 241: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–96

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

'

int *pfeld[5];int i = 1int j;

pfeld[3] = &i;

j = *pfeld[3]; ➍

pfeld ≡

i 1➍

■ Deklaration

1j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

■ Zugriffe auf einen Zeiger desFeldes

➌➍

Page 242: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–97

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i; ➋

j = *pfeld[3]; ➍

pfeld ≡

i 1➍

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

•➋ ➋■ Zugriffe auf einen Zeiger des

Feldes

➊ pfeld[3]

➌ *pfeld[3]

Page 243: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 16 Felder von Zeigern IIa–98

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

16 Felder von Zeigern

■ Auch von Zeigern können Felder gebildet werden

int *pfeld[5];int i = 1int j;

pfeld[3] = &i; ➋

j = *pfeld[3]; ➍

pfeld ≡

i 1➍

■ Deklaration

j

■ Zugriffe auf das Objekt,auf das ein Zeiger desFeldes verweist

•➋ ➋■ Zugriffe auf einen Zeiger des

Feldes

➊ pfeld[3]

➌ *pfeld[3]

Page 244: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.1 IIa–99

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17 Argumente aus der Kommandozeile

| 17.1

Page 245: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–100

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

| 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 5

2. Versionintmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

Page 246: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–101

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

2. Versionlinksseitiger Operator:erst dekrementieren,dann while-Bedingung prüfen→ Schleife läuft für argc=4,3,2,1

intmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 5

Page 247: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–102

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

2. Versionintmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 4

*argvnach 1x argv++

Page 248: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–103

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

2. Versionintmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 3

*argvnach 2x argv++

Page 249: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–104

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

2. Versionintmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 2

*argvnach 3x argv++

Page 250: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–105

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

2. Versionintmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 1

*argvnach 4x argv++

Page 251: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–106

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.

17.2 Zugriff — Beispiel: Ausgeben aller Argumente (2)

■ das folgende Programmstück gibt alle Argumente der Kommandozeile aus

(außer dem Kommandonamen)

'

2. Versionintmain (int argc, char **argv){ while (--argc > 0) {

argv++;printf("%s%c", *argv, (argc>1) ? ’ ’ : ’\n’ );

}...

•argv

NULL

c c \0

- A a \0

- o \0

\0a u f 9

. ca u f 9 \00

argc 0

*argvnach 4x argv++

while-Schleife bricht ab

Page 252: Jürgen Kleinöder - FAU€¦ · der Operator dient zur Formulierung von Bedingungen in Ausdrücken zuerst wird Ausdruck A bewertet ist A ungleich 0, so hat der gesamte Ausdruck als

© jk SP (SS 2015, A-IIa) 17 Argumente aus der Kommandozeile | 17.2 Zugriff — Beispiel: Ausgeben aller Argumente (1) IIa–107

Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.