Zentrale Fragestellung. Grundsätzliche Überlegungen über die Struktur eines Programms vor Beginn der Programmierung. Verschiedene Design-Methoden

Ähnliche Dokumente
3 Module in C. 4 Gültigkeit von Namen. 5 Globale Variablen (2) Gültig im gesamten Programm

F Zeiger, Felder und Strukturen in C

Mechanismus Aufrufer Funktion Funktion Aufrufer Parameter ja mit Hilfe von Zeigern Funktionswert nein ja globale Variablen ja ja

2 Kurzeinführung in die Programmiersprache C 2.7 Programmstruktur & Module. 2 Kurzeinführung in die Programmiersprache C 2.7 Programmstruktur & Module

F Zeiger, Felder und Strukturen in C

c dl SPiC (Teil C, SS 11) 13 Zeiger und Felder 13.1 Zeiger Einführung 13 1 Zeigervariable := Behälter für Verweise ( Adresse) Beispiel int x = 5;

Übungen zur Systemprogrammierung I Wintersemester 2001/2002

E Mikrocontroller-Programmierung. E.2 Beispiel: AVR-Mikrocontroller (ATmega-Serie) 1 Mikrocontroller-Umgebung. E.1 Überblick.

Grundlagen der Programmierung Prof. H. Mössenböck. 7. Arrays

3. Gültigkeit von Definitionen

Ausdrücke haben einen Wert sin(math.pi) wird zu 1 sin(kreisradius) wird zur Laufzeit ausgewertet. Informatik I Kapitel 6

U3 3. Übung U3 3. Übung. Systemnahe Programmierung in C Übungen Moritz Strübe Universität Erlangen-Nürnberg Informatik 4, 2009 U3.fm

Programmieren in C/C++ und MATLAB. Programmieren in C/C++ und MATLAB. Sebastian Bauer Sven Willert Sabine Schmidt

2 Beispiel Sinusberechnung

FORMALE SYSTEME. 7. Vorlesung: Reguläre Ausdrücke. TU Dresden, 2. November Markus Krötzsch

5.2 BASIC MSC (BMSC) BASIC MSC. Kommunikation zwischen Instanzen. Message Sequence Charts

einlesen n > 0? Ausgabe Negative Zahl

Ungleichungen. Jan Pöschko. 28. Mai Einführung

Satz 6.5 (Mittelwertsatz der Integralrechnung) Sei f : [a, b] R stetig. Dann gibt es ein ξ [a, b], so dass. b a. f dx = (b a)f(ξ) f dx (b a)m.

F Zeiger, Felder und Strukturen in C

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

Programmieren in C/C++ und Matlab

Das Rechnen mit Logarithmen

11. DER HAUPTSATZ DER DIFFERENTIAL- UND INTEGRALRECHNUNG

S 1. Definition: Ein endlicher Automat ist ein 5-Tupel. Das endliche Eingabealphabet

Mathematik Bruchrechnung Grundwissen und Übungen

Multiplikative Inverse

Grundlagen der Informatik II Übungsblatt: 2, WS 17/18 mit Lösungen

Falls die Werte von X als Ergebnisse eines Zufallsvorgangs resultieren, wird X zu einer stetigen Zufallsvariable.

Lineare Algebra und Numerische Mathematik für D-BAUG

Bisher haben wir keine Annahmen bzgl. der Sortierung der gegebenen Werte gemacht, d.h. sie durften in beliebiger Reihenfolge im Array a stehen

FORMALE SYSTEME. Kleene s Theorem. Wiederholung: Reguläre Ausdrücke. 7. Vorlesung: Reguläre Ausdrücke. TU Dresden, 2.

Quadratische Funktionen

Versuchsplanung. Grundlagen. Extrapolieren unzulässig! Beobachtungsbereich!

Exportmodul Artikel-Nr.: 20208

1 Zeiger als Funktionsargumente. U3-1 einfache swap_double Funktion. 1 Zeiger als Funktionsargumente. 1 Zeiger als Funktionsargumente.

Formale Systeme, Automaten, Prozesse SS 2010 Musterlösung - Übung 6 M. Brockschmidt, F. Emmes, C. Fuhs, C. Otto, T. Ströder

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

a = c d b Matheunterricht: Gesucht ist x. Physikunterricht Gesucht ist t: s = vt + s0 -s0 s - s0 = vt :v = t 3 = 4x = 4x :4 0,5 = x

- 1 - VB Inhaltsverzeichnis

Grundbegriffe der Informatik Aufgabenblatt 6

Kapitel 6. Funktionen

Funktionen. Kapitel 6. Reelle Funktion. Graph einer Funktion. Beispiel. Beispiel. Zeichnen eines Graphen. Bijektivität

6. Quadratische Gleichungen

Endliche Automaten und ihre Verwendung in der morphologischen Verarbeitung. Hans Uszkoreit

Integrieren. Regeln. Einige Integrale die man auswendig kennen sollte. Partielle Integration

Datenstrukturen & Algorithmen Lösungen zu Blatt 2 FS 12

U8 7. Übung U8 7. Übung

Vektoren 105. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

1 Metrische Räume. Sei X eine nichtleere Menge. Definition 1.1. Eine Abbildung: d : X X R heißt Metrik auf X, falls für alle x, y, z X gilt

Kurvenintegrale. 17. Juli 2006 (Korrigierte 2. Version) 1 Kurvenintegrale 1. Art (d.h. f ist Zahl, kein Vektor)

Grundlagen zu Datenstrukturen und Algorithmen Schmitt, Schömer SS 2001

Grundlagen der Integralrechnung

Universität Karlsruhe Institut für Theoretische Informatik. Klausur: Informatik III

2. Programmierung in C

1KOhm + - y = x LED leuchtet wenn Schalter x gedrückt ist

Klausur über den Stoff der Vorlesung Grundlagen der Informatik II (90 Minuten)

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Crashkurs - Integration

Lösungen Quadratische Gleichungen. x = x x = Also probieren wir es 3 4 = 12. x + + = Lösen Sie die folgenden Gleichungen nach x auf:

Umwandlung von endlichen Automaten in reguläre Ausdrücke

Vorlesung. Einführung in die mathematische Sprache und naive Mengenlehre

C/C++-Programmierung

Übungen zu Wurzeln III

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

3 Uneigentliche Integrale

G2 Grundlagen der Vektorrechnung

Resultat: Hauptsatz der Differential- und Integralrechnung

E Mikrocontroller-Programmierung

Kantonale Prüfungen Mathematik I Prüfung für den Übertritt aus der 8. Klasse

Def.: Sei Σ eine Menge von Zeichen. Die Menge Σ* aller Zeichenketten (Wörter) über Σ ist die kleinste Menge, für die gilt:

Programmiersprachen Einführung in C

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

1. Stegreifaufgabe aus der Physik Lösungshinweise

Effiziente Algorithmen und Komplexitätstheorie

Grundlagen der Systemnahen Programmierung in C (GSPiC)

Zeiger (engl. Pointer)

Arrays 115. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

3 Hyperbolische Geometrie

a Z1 a 1 a 1,2 Diese Matrix hat genau dann Rang 2, ist also genau dann invertierbar, wenn a 2,2 a 1,2a 2,1

7.9A. Nullstellensuche nach Newton

Teil 1: Rechenregeln aus der Mittelstufe. Allgemeine Termumformungen

Algebra-Training. Theorie & Aufgaben. Serie 3. Bruchrechnen. Theorie: Katharina Lapadula. Aufgaben: Bernhard Marugg. VSGYM / Volksschule Gymnasium

Kapitel 10. Integration. Josef Leydold Mathematik für VW WS 2015/16 10 Integration 1 / 35

5.1 Charakterisierung relativ kompakter und kompakter

Verlauf Material LEK Glossar Lösungen. In acht Leveln zum Meister! Exponentialgleichungen lösen. Kerstin Langer, Kiel VORANSICHT

Beispiellösungen zu Blatt 24

10: Lineare Abbildungen

Brückenkurs Lineare Gleichungssysteme und Vektoren

4 Stetigkeit. 4.1 Intervalle

Grundlagen der Integralrechnung

12. STAMMFUNKTIONEN UND DAS UNBESTIMMTE INTEGRAL

RWTH Aachen Lehrgebiet Theoretische Informatik Rossmanith Dreier Hark Kuinke. SS 2017 Blatt

2. Funktionen in der Ökonomie

14. INTEGRATION VON VEKTORFUNKTIONEN

Der Gauß - Algorithmus

Dynamische Speicherverwaltung

Vorkurs Mathematik für Ingenieur Innen WS 2017/2018 Übung 3. (a) Berechnen Sie die fehlenden Strecken und Winkel im folgenden rechtwinkligen Dreieck:

Doppel- und Dreifachintegrale

2. Das Rechnen mit ganzen Zahlen (Rechnen in )

Transkript:

7 Progrmmstruktur & Module 7Progrmmstruktur & Module 7.1 Softwredesign 7.1 Softwredesign Grundsätzliche Überlegungen über die Struktur eines Progrmms vor Beginn der Progrmmierung Verschiedene Design-Methoden Top-down Entwurf / Prozedurle Progrmmierung trditionelle Methode bis Mitte der 80er Jhre fst usschließlich verwendet n Progrmmiersprchen wie Fortrn, Cobol, Pscl oder C orientiert Objekt-orientierter Entwurf moderne, sehr ktuelle Methode Ziel: Bewältigung sehr komplexer Probleme uf Progrmmiersprchen wie C++, Smlltlk oder Jv usgerichtet 7.2 Top-down Entwurf Zentrle Frgestellung ws ist zu tun? 7 Progrmmstruktur & Module 7.2 Top-down Entwurf in welche Teilufgben lässt sich die ufgbe untergliedern? Beispiel: Rechnung für Kunden usgeben Rechnungspositionen zusmmenstellen Lieferungsposten einlesen Preis für Produkt ermitteln Mehrwertsteuer ermitteln Rechnungspositionen ddieren Positionen formtiert usdrucken Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 25 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 26 / 115 7 Progrmmstruktur & Module 7.2 Top-down Entwurf (2) 7.2 Top-down Entwurf 7 Progrmmstruktur & Module 7.2 Top-down Entwurf 7.2 Top-down Entwurf (3) Modul-Bildung Problem: Gliederung betrifft nur die ktivitäten, nicht die Struktur der Dten Gefhr: Sehr viele Funktionen rbeiten "wild" uf einer Unmenge schlecht strukturierter Dten Lösung: Gliederung von Dtenbeständen zusmmen mit Funktionen, die druf operieren Modul Dten Funktion1 Funktion6 Funktion4 Funktion2 Funktion5 Funktion3 Funktion1 Funktion2 Funktion4 Funktion3 Funktion5 Funktion6 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 27 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 28 / 115

7 Progrmmstruktur & Module 7.3 Module in C 7 Progrmmstruktur & Module 7.3 Module in C 7.3 Module in C 7.3 Module in C (2) Teile eines C-Progrmms können uf mehrere.c-dteien (C-Quelldteien) verteilt Logisch zusmmengehörende Dten und die druf operierenden Funktionen sollten jeweils zusmmengefsst Modul Jede C-Quelldtei knn seprt übersetzt (Option -c) Zwischenergebnis der Übersetzung wird in einer.o-dtei bgelegt % cc -c prog.c (erzeugt Dtei prog.o ) % cc -c f1.c (erzeugt Dtei f1.o ) % cc -c f2.c f3.c (erzeugt f2.o und f3.o ) Ds Kommndo cc knn mehrere.c Dteien übersetzen und ds Ergebnis zusmmen mit.o Dteien binden:!!!.c Quelldteien uf keinen Fll mit Hilfe der #include nweisung in ndere Quelldteien einkopieren Bevor eine Funktion us einem nderen Modul ufgerufen knn, muss sie deklriert Prmeter und Rückgbewerte müssen beknnt gemcht Mkrodefinitionen und Deklrtionen, die in mehreren Quelldteien eines Progrmms benötigt, zu Heder-Dteien zusmmengefsst Heder-Dteien mit der #include nweisung des Präprozessors in C-Quelldteien einkopiert der Nme einer Heder-Dtei endet immer uf.h % cc -o prog prog.o f1.o f2.o f3.o f4.c f5.c Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 29 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 30 / 115 7 Progrmmstruktur & Module 7.4 Gültigkeit von Nmen 7 Progrmmstruktur & Module 7.5 Globle Vriblen 7.4 Gültigkeit von Nmen 7.5 Globle Vriblen Gültigkeitsregeln legen fest, welche Nmen (Vriblen und Funktionen) wo im Progrmm beknnt sind Mehrere Stufen 1. Globl im gesmten Progrmm (über Modul- und Funktionsgrenzen hinweg) 2. Globl in einem Modul (uch über Funktionsgrenzen hinweg) 3. Lokl innerhlb einer Funktion 4. Lokl innerhlb eines Blocks Überdeckung bei Nmensgleichheit eine lokle Vrible innerhlb einer Funktion überdeckt gleichnmige globle Vriblen eine lokle Vrible innerhlb eines Blocks überdeckt gleichnmige globle Vriblen und gleichnmige lokle Vriblen in umgebenden Blöcken Gültig im gesmten Progrmm Globle Vriblen ußerhlb von Funktionen definiert Globle Vriblen sind b der Definition in der gesmten Dtei zugreifbr Globle Vriblen, die in nderen Modulen definiert wurden, müssen vor dem ersten Zugriff beknntgemcht ( extern Deklrtion = Typ und Nme beknntmchen) Beispiele: extern Typ Nme extern int, b; extern chr c;, ; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 31 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 32 / 115

7 Progrmmstruktur & Module 7.5 Globle Vriblen 7 Progrmmstruktur & Module 7.5 Globle Vriblen 7.5 Globle Vriblen (2) 7.5 Globle Funktionen Probleme mit globlen Vriblen Zusmmenhng zwischen Dten und druf operierendem Progrmmcode geht verloren Funktionen können Vriblen ändern, ohne dss der ufrufer dies erwrtet (Seiteneffekte) Progrmme sind schwer zu pflegen, weil bei Änderungen der Vriblen erst lle Progrmmteile, die sie nutzen gesucht müssen Funktionen sind generell globl (es sei denn, die Erreichbrkeit wird explizit uf ds Modul begrenzt) Funktionen us nderen Modulen müssen ebenflls vor dem ersten ufruf deklriert (= Typ, Nme und Prmetertypen beknntmchen) Ds Schlüsselwort extern ist bei einer Funktionsdeklrtion nicht notwendig globle Vriblen möglichst vermeiden Beispiele: double sinus(double); flot power(flot, int); Globle Funktionen (und soweit vorhnden die globlen Dten) bilden die äußere Schnittstelle eines Moduls "vertrgliche" Zusicherung n den Benutzer des Moduls Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 33 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 34 / 115 7 Progrmmstruktur & Module 7.6 Einschränkung der Gültigkeit uf ein Modul 7.6 Einschränkung der Gültigkeit uf ein Modul 7 Progrmmstruktur & Module 7.7 Lokle Vriblen 7.7 Lokle Vriblen Zugriff uf eine globle Vrible oder Funktion knn uf ds Modul (= die Dtei) beschränkt, in der sie definiert wurde Schlüsselwort sttic vor die Definition setzen sttic Vriblen-/Funktionsdefinition extern-deklrtionen in nderen Modulen sind nicht möglich Die sttic-vriblen bilden zusmmen den Zustnd eines Moduls, die Funktionen des Moduls operieren uf diesem Zustnd Vriblen, die innerhlb einer Funktion oder eines Blocks definiert, sind lokle Vriblen bei Nmensgleichheit zu globlen Vriblen oder loklen Vriblen eines umgebenden Blocks gilt die jeweils letzte Definition lokle Vriblen sind ußerhlb des Blocks, in dem sie definiert wurden, nicht zugreifbr und hben dort keinen Einfluss uf die Zugreifbrkeit von Vriblen Hilfsfunktionen innerhlb eines Moduls, die nur von den Modulfunktionen benötigt, sollten immer sttic definiert sie ddurch nicht Bestndteil der Modulschnittstelle (= des "Vertrgs" mit den Modulbenutzern)!!! ds Schlüsselwort sttic gibt es uch bei loklen Vriblen (mit nderer Bedeutung! - dort jeweils kursiv geschrieben) Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 35 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 36 / 115

7 Progrmmstruktur & Module 7.8 Gültigkeitsbereiche Übersicht Funktion1 Funktion2 Funktion4 Funktion3 7.8 Gültigkeitsbereiche Übersicht Funktion6 Modul1 Modul2 Modul3 Funktion5 globle Vriblen modul-lokle Vriblen =globl sttic funktionslokle Vriblen modullokle Funktion modul-lokle Funktion (= sttic) globle Funktionen 7 Progrmmstruktur & Module 7.9 Lebensduer von Vriblen 7.9 Lebensduer von Vriblen Die Lebensduer einer Vriblen bestimmt, wie lnge der Speicherpltz für die Vrible ufgehoben wird Zwei rten Speicherpltz bleibt für die gesmte Progrmmusführungszeit reserviert sttische (sttic) Vriblen Speicherpltz wird bei Betreten eines Blocks reserviert und dnch wieder freigegeben dynmische (utomtic) Vriblen Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 37 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 38 / 115 7 Progrmmstruktur & Module 7.9 Lebensduer von Vriblen 7 Progrmmstruktur & Module 7.9 Lebensduer von Vriblen 7.9 Lebensduer von Vriblen (2) 7.9 Lebensduer von Vriblen (3) uto-vriblen sttic-vriblen lle loklen Vriblen sind utomtic-vriblen der Speicher wird bei Betreten des Blocks / der Funktion reserviert und bei Verlssen wieder freigegeben der Wert einer loklen Vriblen ist beim nächsten Betreten des Blocks nicht mehr sicher verfügbr! Lokle uto-vriblen können durch beliebige usdrücke initilisiert die Initilisierung wird bei jedem Eintritt in den Block wiederholt!!! wird eine uto-vrible nicht initilisiert, ist ihr Wert vor der ersten Zuweisung undefiniert (= irgendws) Der Speicher für lle globlen Vriblen ist generell von Progrmmstrt bis Progrmmende reserviert Lokle Vriblen erhlten bei Definition mit dem Schlüsselwort sttic eine Lebensduer über die gesmte Progrmmusführung hinweg der Inhlt bleibt bei Verlssen des Blocks erhlten und ist bei einem erneuten Eintreten in den Block noch verfügbr!!! Ds Schlüsselwort sttic ht bei globlen Vriblen eine völlig ndere Bedeutung (Einschränkung des Zugriffs uf ds Modul) Sttic-Vriblen können durch beliebige konstnte usdrücke initilisiert die Initilisierung wird nur einml beim Progrmmstrt vorgenommen (uch bei loklen Vriblen!) erfolgt keine explizite Initilisierung, wird utomtisch mit 0 vorbelegt Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 39 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 40 / 115

8.1 Einordnung 8.2 Überblick 8Zeiger(-Vriblen) 8.2 Überblick ' 8.1 Einordnung Eine Zeigervrible (pointer) enthält ls Wert die dresse einer nderen Vriblen Konstnte: Bezeichnung für einen Wert 0110 0001 der Zeiger verweist uf die Vrible Über diese dresse knn mn indirekt uf die Vrible zugreifen Vrible: Bezeichnung eines Dtenobjekts Zeiger-Vrible (Pointer): Bezeichnung einer Referenz uf ein Dtenobjekt chr *p = &; p Drus resultiert die große Bedeutung von Zeigern in C Funktionen können ihre rgumente verändern (cll-by-reference) dynmische Speicherverwltung effizientere Progrmme ber uch Nchteile! Progrmmstruktur wird unübersichtlicher (welche Funktion knn uf welche Vrible zugreifen?) häufigste Fehlerquelle bei C-Progrmmen Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 41 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 42 / 115 8.3 Definition von Zeigervriblen 8.4 dressopertoren 8.3 Definition von Zeigervriblen 8.4 dressopertoren Syntx: dressopertor &. Typ *Nme ; &x der unäre dress-opertor liefert eine Referenz uf den Inhlt der Vriblen (des Objekts) x Beispiele int x = 5; int *; int y; = &x; x y 5 5 Verweisopertor *. *x der unäre Verweisopertor * ermöglicht den Zugriff uf den Inhlt der Vriblen (des Objekts), uf die der Zeiger x verweist y = *; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 43 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 44 / 115

8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente ' 8.5 Zeiger ls Funktionsrgumente (2) Prmeter in C by-vlue übergeben die ufgerufene Funktion knn den ktuellen Prmeter beim ufrufer nicht verändern uch Zeiger by-vlue übergeben, d. h. die Funktion erhält lediglich eine Kopie des dressverweises über diesen Verweis knn die Funktion jedoch mit Hilfe des *-Opertors uf die zugehörige Vrible zugreifen und sie verändern cll-by-reference void swp (int *, int *); int min() int, b; swp(&, &b); void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; b px py tmp Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 45 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 46 / 115 8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente (2) 8.5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, b; swp(&, &b); b void swp (int *, int *); int min() int, b; swp(&, &b); b void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; px py tmp void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; px py tmp Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 47 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 48 / 115

8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente (2) 8.5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, b; swp(&, &b); void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; b *px px py tmp void swp (int *, int *); int min() int, b; swp(&, &b); void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; ➌ *py = tmp; b *px px *py py tmp ➌ Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 49 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 50 / 115 8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente 8.5 Zeiger ls Funktionsrgumente (2) 8.5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, b; swp(&, &b); void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; ➍ b px *py py tmp ➍ void swp (int *, int *); int min() int, b; swp(&, &b); void swp (int *px, int *py) int tmp; tmp = *px; *px = *py; ➌ *py = tmp; ➍ b px py tmp ➌ ➍ Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 51 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 52 / 115

8.6 Zeiger uf Strukturen 8.6 Zeiger uf Strukturen 8.6 Zeiger uf Strukturen 8.6 Zeiger uf Strukturen (2) Konzept nlog zu "Zeiger uf Vriblen" dresse einer Struktur mit &-Opertor zu bestimmen Zeigerrithmetik berücksichtigt Strukturgröße Beispiele struct person stud1; struct person *pstud; pstud = &stud1; /* pstud stud1 */ Zugriff uf Strukturkomponenten über einen Zeiger Beknnte Vorgehensweise *-Opertor liefert die Struktur.-Opertor zum Zugriff uf Komponente Opertorenvorrng bechten (*pstud).best = n ; (*pstud).lter = 21; unleserlich! Besondere Bedeutung zum ufbu verketteter Strukturen Syntktische Verschönerung ->-Opertor (*pstud).best pstud->lter = = 21; n ; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 53 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 54 / 115 8.7 Zusmmenfssung Vrible int ; 5 Zeiger int ; *p = &; 5 p 8.7 Zusmmenfssung Struktur struct int ; sint ; chr c;; struct s s1 = 2, ; s1 2 Zeiger uf Struktur int struct ; s *sp = &s1; s1 2 sp 9Felder 9 Felder 9.1 Eindimensionle Felder 9.1 Eindimensionle Felder eine Reihe von Dten desselben Typs knn zu einem Feld zusmmengefsst bei der Definition wird die Größe des Felds ngegeben Größe muss eine Konstnte sein b C99 bei loklen Feldern uch zur Lufzeit berechnete Werte zulässig der Zugriff uf die Elemente erfolgt durch Indizierung, beginnend bei Null Definition eines Feldes Typ Nme [ Größe ] Initilisierung ; Beispiele: int x[5]; double f[20]; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 55 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 56 / 115

9 Felder 9.2 Initilisierung eines Feldes 9 Felder 9.3 Initilisierung eines Feldes (2) 9.2 Initilisierung eines Feldes 9.3 Initilisierung eines Feldes (2) =, konstnter usdruck Felder des Typs chr können uch durch String-Konstnten initilisiert chr nme1[5] = "Otto"; chr nme2[] = "Otto"; Ein Feld knn durch eine Liste von konstnten usdrücken, die durch Komm getrennt sind, initilisiert int prim[4] = 2, 3, 5, 7; chr nme[5] = O, t, t, o, \0 ; wird die explizite Felddimensionierung weggelssen, so bestimmt die Zhl der Initilisierungskonstnten die Feldgröße int prim[] = 2, 3, 5, 7; chr nme[] = O, t, t, o, \0 ; zu wenig Initilisierungskonstnten ngegeben, so die restlichen Elemente mit 0 initilisiert Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 57 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 58 / 115 9 Felder 9.4 Zugriffe uf Feldelemente Indizierung: wobei: Beispiele: Feldnme [ usdruck ] 0 <= Wert(usdruck) < Feldgröße prim[0] == 2 prim[1] == 3 nme[1] == t nme[4] == \0 9.4 Zugriffe uf Feldelemente ' 10Zeiger und Felder ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert es gilt: int rry[5]; int * = rry; rry Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 59 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 60 / 115

10Zeiger 2. und Felder 10Zeiger 2. und Felder ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert es gilt: es gilt: int rry[5]; rry int rry[5]; rry int * = rry; int * = rry; int *ep; ep = &rry[0]; int *ep; ep = &rry[0]; ep ep Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 61 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 62 / 115 10Zeiger 2. und Felder 10Zeiger 2. und Felder ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert es gilt: es gilt: int rry[5]; rry int rry[5]; rry int * = rry; int *ep; ep = &rry[0]; int * = rry; int *ep; ep = &rry[0]; ep = &rry[2]; ➌ ep = &rry[2]; ➌ ep ➌ ep ➌ Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 63 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 64 / 115

10Zeiger 2. und Felder 10Zeiger 2. und Felder ' ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert ein Feldnme ist ein konstnter Zeiger uf ds erste Element des Feldes im Gegenstz zu einer Zeigervriblen knn sein Wert nicht verändert es gilt: es gilt: int rry[5]; rry int rry[5]; rry int * = rry; int *ep; ep = &rry[0]; 1 ➍ int * = rry; int *ep; ep = &rry[0]; 1 ➍ ep = &rry[2]; *ep = 1; ➍ *ep ep ep = &rry[2]; ➌ *ep = 1; ➍ ep ➌ ➌ Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 65 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 66 / 115 10.1 rithmetik mit dressen 10.2 Zeigerrithmetik und Felder 10.1rithmetik mit dressen 10.2Zeigerrithmetik und Felder ' ++ -Opertor: Inkrement = nächstes Objekt int rry[3]; int * = rry; ++; ++; ➌ -- -Opertor: Dekrement = vorheriges Objekt +, ddition und Subtrktion von Zeigern und gnzzhligen Werten. Dbei wird immer die Größe des Objekttyps berücksichtigt! rry!!! chtung: ssozitivität der Opertoren bechten ➌ int rry[5]; = rry; = +3; Ein Feldnme ist eine Konstnte für die dresse des Feldnfngs Feldnme ist ein gnz normler Zeiger Opertoren für Zeiger nwendbr ( *, [] ) ber keine Vrible keine Modifiktionen erlubt es gilt: keine Zuweisung, kein ++, --, +=, int rry[5]; /* rry ist Konstnte für den Wert &rry[0] */ int * = rry;/* int * = &rry[0] */ int *ep; /* Folgende Zuweisungen sind äquivlent */ rry[i] = 1; [i] = 1; *(+i) = 1; /* Vorrng! */ *(rry+i) = 1; ep = &rry[i]; *ep = 1; ep = rry+i; *ep = 1; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 67 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 68 / 115

10.2 Zeigerrithmetik und Felder 10.2 Zeigerrithmetik und Felder 10.2Zeigerrithmetik und Felder 10.2Zeigerrithmetik und Felder int rry[5]; int *pointer; chr buffer[6]; chr *bptr; rry 10 920 int rry[5]; int *pointer; chr buffer[6]; chr *bptr; rry ➒ 10 920 ➑ 700 rry[0] = 10; rry[1] = 920; ➌ strcpy(buffer,"hllo"); ➍ pointer = rry; ➎ bptr = buffer; Fomle Prmeter der Funktion strcpy ziel quelle ➌ ➌ pointer buffer ➍ ➎ bptr ➎ "hllo" h l l o \0 ➍ h l l o \0 ➌ rry[0] = 10; rry[1] = 920; ➌ strcpy(buffer,"hllo"); ➍ pointer = rry; ➎ bptr = buffer; ➏ pointer++; ➐ bptr++; ➑ *pointer = 700; ➒ rry++; pointer buffer bptr ➏ ➏ ➐ ➐ h l l o \0 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 69 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 70 / 115 10.3Mehrdimensionle Felder 10.3 Mehrdimensionle Felder 10.4 Zugriffe uf Feldelemente bei mehrdim. Fel- 10.4Zugriffe uf Feldelemente bei mehrdim. Feldern neben eindimensionlen Felder knn mn uch mehrdimensionle Felder vereinbren Definition eines mehrdimensionlen Feldes Indizierung: Feldnme [ 1 ] [ n ] Typ Nme [ Größe ] Initilisierung ; wobei: 0 <= i < Größe der Dimension i des Feldes n = nzhl der Dimensionen des Feldes int mtrix[4][4]; Relisierung: in der internen Speicherung die Feldelemente zeilenweise hintereinnder im Speicher bgelegt Felddefinition: int f[2][2]; blge der Elemente: f[0][0], f[0][1], f[1][0], f[1][1] f ist ein Zeiger uf f[0][0] int feld[5][8]; feld[2][3] = 10; ist äquivlent zu: int feld[5][8]; int *f1; f1 = (int*)feld; f1[2*8 + 3] = 10; oder *(f1 + (2*8 + 3)) = 10; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 71 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 72 / 115

10.5Initilisierung eines mehrdimensionlen Feldes 10.5 Initilisierung eines mehrdimensionlen ein mehrdimensionles Feld knn - wie ein eindimensionles Feld - durch eine Liste von konstnten Werten, die durch Komm getrennt sind, initilisiert wird die explizite Felddimensionierung weggelssen, so bestimmt die Zhl der Initilisierungskonstnten die Größe des Feldes 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] in dem Beispiel mit 0 initilisiert! 11 Dynmische Speicherverwltung 1Dynmische Speicherverwltung Felder können (mit einer usnhme im C99-Stndrd) nur mit sttischer Größe definiert Wird die Größe eines Feldes erst zur Lufzeit des Progrmm beknnt, knn der benötigte Speicherbereich dynmisch vom Betriebssystem ngefordert : Funktion mlloc Ergebnis: Zeiger uf den nfng des Speicherbereichs Zeiger knn dnch wie ein Feld verwendet ( []-Opertor) void *mlloc(size_t size) int *feld; cst-opertor int groesse; feld = (int *) mlloc(groesse * sizeof(int)); if (feld == NULL) perror("mlloc feld"); exit(1); for (i=0; i<groesse; i++) feld[i] = 8; sizeof-opertor Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 73 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 74 / 115 11 Dynmische Speicherverwltung 1Dynmische 2. Speicherverwltung (2) Dynmisch ngeforderte Speicherbereiche können mit der free- Funktion wieder freigegeben void free(void *ptr) double *dfeld; int groesse; dfeld = (double *) mlloc(groesse * sizeof(double)); free(dfeld); die Schnittstellen der Funktionen sind in in der include-dtei stdlib.h definiert #include <stdlib.h> 12 Explizite Typumwndlung Cst-Opertor 12Explizite Typumwndlung Cst-Opertor C enthält Regeln für eine utomtische Konvertierung unterschiedlicher Typen in einem usdruck Beispiel: In mnchen Fällen wird eine explizite Typumwndlung benötigt (vor llem zur Umwndlung von Zeigern) Syntx: Beispiel: (Typ) Vrible int i = 5; flot f = 0.2; double d; Beispiele: (int) (flot) b feld = (int *) mlloc(groesse * sizeof(int)); d = i * f; (int *) (chr *) flot double mlloc liefert Ergebnis vom Typ (void *) cst-opertor mcht drus den Typ (int *) Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 75 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 76 / 115

13sizeof-Opertor 13 sizeof-opertor 14 Eindimensionle Felder ls Funktionsprme- 14Eindimensionle Felder ls Funktionsprmeter In mnchen Fällen ist es notwendig, die Größe (in Byte) einer Vriblen oder Struktur zu ermitteln z. B. zum nfordern von Speicher für ein Feld ( mlloc) Syntx: sizeof x sizeof (Typ) Ds Ergebnis ist vom Typ size_t ( int) (#include <stddef.h>!) liefert die Größe des Objekts x in Bytes liefert die Größe eines Objekts vom Typ Typ in Bytes int ; size_t b; b = sizeof ; /* b = 2 oder b = 4 */ b = sizeof(double) /* b = 8 */ gnze Felder können in C nicht by-vlue übergeben wird einer Funktion ein Feldnme ls Prmeter übergeben, wird dmit der Zeiger uf ds erste Element "by vlue" übergeben die Funktion knn über den formlen Prmeter (=Kopie des Zeigers) in gleicher Weise wie der ufrufer uf die Feldelemente zugreifen (und diese verändern!) bei der Deklrtion des formlen Prmeters wird die Feldgröße weggelssen die Feldgröße ist utomtisch durch den ktuellen Prmeter gegeben die Funktion kennt die Feldgröße dmit nicht ggf. ist die Feldgröße über einen weiteren int-prmeter der Funktion explizit mitzuteilen die Länge von Zeichenketten in chr-feldern knn normlerweise durch Suche nch dem \0-Zeichen bestimmt Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 77 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 78 / 115 14 Eindimensionle Felder ls Funktionsprme- 14Eindimensionle 2. Felder ls Funktionsprmeter (2) wird ein Feldprmeter ls const deklriert, können die Feldelemente innerhlb der Funktion nicht verändert Funktionsufruf und Deklrtion der formlen Prmeter m Beispiel eines int-feldes: int, b; int feld[20]; func(, feld, b); int func(int p1, int p2[], int p3); oder: int func(int p1, int *p2, int p3); 14 Eindimensionle Felder ls Funktionsprme- 14Eindimensionle 2. Felder ls Funktionsprmeter (3) Beispiel 1: Bestimmung der Länge einer Zeichenkette (String) int strlen(const chr string[]) int i=0; while (string[i]!= \0 ) ++i; return(i); die Prmeter-Deklrtionen int p2[] und int *p2 sind vollkommen äquivlent! im Unterschied zu einer Vriblendefinition int f[] = 1, 2, 3; // initilisiertes Feld mit 3 Elementen int f1[]; // ohne Initilisierung oder Dimension nicht erlubt! int *p; // Zeiger uf einen int Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 79 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 80 / 115

14 Eindimensionle Felder ls Funktionsprme- 14Eindimensionle 2. Felder ls Funktionsprmeter (4) Beispiel 2: Konkteniere Strings void strct(chr to[], const chr from[]) int i=0, j=0; while (to[i]!= \0 ) i++; while ( (to[i++] = from[j++])!= \0 ) ; Funktionsufruf mit Feld-Prmetern ls ktueller Prmeter beim Funktionsufruf wird einfch der Feldnme ngegeben chr s1[50] = "text1"; chr s2[] = "text2"; strct(s1, s2);/* s1= "text1text2" */ strct(s1, "text3");/* s1= "text1text2text3" */ ' 15 Zeiger, Felder und Zeichenketten 15Zeiger, Felder und Zeichenketten Zeichenketten sind Felder von Einzelzeichen (chr), die in der internen Drstellung durch ein \0 Zeichen bgeschlossen sind Länge eines Strings ermitteln ufruf strlen(x); /* 1. Version */ int strlen(const chr *s) int n; for (n=0; *s!= \0 ; s++) n++; return(n); /* 2. Version */ int strlen(const chr *s) chr *p = s; while (*p!= \0 ) p++; return(p-s); x s x s n=0 h l s++ h l p l l o \0 n=4 o \0 p++ n=5 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 81 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 82 / 115 15 Zeiger, Felder und Zeichenketten 15Zeiger, 2. Felder und Zeichenketten (2) wird eine Zeichenkette zur Initilisierung eines chr Feldes verwendet, ist der Feldnme ein konstnter Zeiger uf den nfng der Zeichenkette chr messge[] = "now is the time"; n o w _ i s _ t h e _ t i m e \0 messge 15 Zeiger, Felder und Zeichenketten 15Zeiger, 2. Felder und Zeichenketten (3) wird eine Zeichenkette zur Initilisierung eines chr Zeigers verwendet, ist der Zeiger eine Vrible, die mit der nfngsdresse der Zeichenkette initilisiert wird chr *pmessge = "hello world"; h e l l o _ w o r l d \0 pmessge pmessge++; printf("%s", pmessge); /*gibt "ello world" us*/ wird dieser Zeiger überschrieben, ist die Zeichenkette nicht mehr dressierbr! h e l l o _ w o r l d \0 pmessge h l l o \0 ➌ pmessge = "hllo"; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 83 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 84 / 115

15 Zeiger, Felder und Zeichenketten 15Zeiger, 2. Felder und Zeichenketten (4) die Zuweisung eines chr Zeigers oder einer Zeichenkette n einen chr Zeiger bewirkt kein Kopieren von Zeichenketten! pmessge = messge; weist dem Zeiger pmessge lediglich die dresse der Zeichenkette "now is the time" zu n o w _ i s _ t h e _ t i m e \0 messge pmessge wird eine Zeichenkette ls ktueller Prmeter n eine Funktion übergeben, erhält diese eine Kopie des Zeigers 15 Zeiger, Felder und Zeichenketten 15Zeiger, 2. Felder und Zeichenketten (5) Zeichenketten kopieren /* 1. Version */ void strcpy(chr to[], const chr from[]) int i=0; while ( (to[i] = from[i])!= \0 ) i++; /* 2. Version */ void strcpy(chr *to, const chr *from) while ( (*to = *from)!= \0 ) to++, from++; /* 3. Version */ void strcpy(chr *to, const chr *from) while ( *to++ = *from++ ) ; Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 85 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 86 / 115 15 Zeiger, Felder und Zeichenketten 15Zeiger, 2. Felder und Zeichenketten (6) in NSI-C können Zeichenketten in nicht-modifizierbren Speicherbereichen ngelegt (je nch Compiler) Schreiben in Zeichenketten (Zuweisungen über dereferenzierte Zeiger) knn zu Progrmmbstürzen führen! Beispiel: pmessge ber! strcpy("zu ueberschreiben", "reinschreiben"); chr *pmessge = "hello world"; h e l l o _ w x o r l d \0 pmessge[6] = x ; chr messge[] = "hello world"; messge[6] = x ; ok! ' 16Felder von Zeigern 16 Felder von Zeigern uch von Zeigern können Felder gebildet Deklrtion int *pfeld[5]; int i = 1 int j; Zugriffe uf einen Zeiger des Feldes pfeld[3] = &i; Zugriffe uf ds Objekt, uf ds ein Zeiger des Feldes verweist j = *pfeld[3]; ➍ ➍ ➌ pfeld pfeld[3] ➌ * pfeld[3] i 1 ➍ j Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 87 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 88 / 115

16Felder 2. von Zeigern (2) 16 Felder von Zeigern Definition und Initilisierung eines Zeigerfeldes: chr *month_nme(int n) sttic chr *Montsnmen[] = "Unzulessiger Mont", "Jnur", "Dezember" ; return ( (n<0 n>12)? Montsnmen[0] : Montsnmen[n] ); 17 rgumente us der Kommndozeile 17rgumente us der Kommndozeile beim ufruf eines Kommndos können normlerweise rgumente übergeben der Zugriff uf diese rgumente wird der Funktion min( ) durch zwei ufrufprmeter ermöglicht: int min (int rgc, chr *rgv[]) oder int min (int rgc, chr **rgv) Montsnmen U n z u l M o n t \0 J n u r \0 F e b r u r \0 M e r z \0 der Prmeter rgc enthält die nzhl der rgumente, mit denen ds Progrmm ufgerufen wurde der Prmeter rgv ist ein Feld von Zeiger uf die einzelnen rgumente (Zeichenketten) D e z e m b e r \0 der Kommndonme wird ls erstes rgument übergeben (rgv[0]) Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 89 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 90 / 115 17 rgumente us der Kommndozeile 17.1 Dtenufbu 17 rgumente us der Kommndozeile 17.2 Zugriff Beispiel: usgeben ller rgu- 17.1Dtenufbu 17.2Zugriff Beispiel: usgeben ller rgumente (1) ' Kommndo: rgc 5 rgv cc - -o uf9 uf9.c Dtei cc.c: min(int rgc, chr *rgv[]) rgv[1] NULL 0 c c \0 - \0 - o \0 u f 9 * rgv[1] oder rgv[1][0] \0 u f 9. c \0 rgv[3][1] ds folgende Progrmmstück gibt lle rgumente der Kommndozeile us (ußer dem Kommndonmen) int min (int rgc, chr *rgv[]) int i; for ( i=1; i<rgc; i++) printf("%s%c", rgv[i], (i < rgc-1)? : \n ); rgc 5 rgv rgv[1] rgv[2] rgv[3] rgv[4] rgv[5] NULL 0 c c \0 - \0 - o \0 u f 9 1. Version \0 u f 9. c \0 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 91 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 92 / 115

17 rgumente us der Kommndozeile 17.2 Zugriff Beispiel: usgeben ller rgu- 17.2Zugriff Beispiel: usgeben ller rgumente (2) ds folgende Progrmmstück gibt lle rgumente der Kommndozeile us (ußer dem Kommndonmen) int min (int rgc, chr **rgv) while (--rgc > 0) rgv++; linksseitiger Opertor: erst dekrementieren, 2. Version dnn while-bedingung prüfen Schleife läuft für rgc=4,3,2,1 printf("%s%c", *rgv, (rgc>1)? : \n ); 18Zeiger uf Zeiger 18 Zeiger uf Zeiger ein Zeiger knn uf eine Vrible verweisen, die ihrerseits ein Zeiger ist int x = 5; int * = &x; int **p = &; /* ** p = 5 */ x 5 p rgc 5 4321 0 rgv *rgv nch 1x rgv++ *rgv nch 4x rgv++ NULL 0 c c \0 - \0 - o \0 u f 9 \0 u f 9. c \0 wird vor llem bei der Prmeterübergbe n Funktionen benötigt, wenn ein Zeiger "cll bei reference" übergeben muss (z. B. swp-funktion für Zeiger) Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 93 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 94 / 115 19Strukturen Beispiele 19 Strukturen struct student chr nchnme[25]; chr vornme[25]; chr gebdtum[11]; int mtrnr; short gruppe; chr best; ; Initilisierung Strukturen ls Funktionsprmeter Felder von Strukturen Zeiger uf Strukturen struct komplex double re; double im; ; 19 Strukturen 19.1Initilisieren von Strukturen 19.1 Initilisieren von Strukturen Strukturen können wie Vriblen und Felder bei der Definition initilisiert die Zuordnung zu den Komponenten erfolgt entweder ufgrund der Reihenfolge oder ufgrund des ngegebenen Nmens (in C++ nur ufgrund der Reihenfolge möglich!) Beispiele struct student stud1 = "Meier", "Hns", "24.01.1970", 1533180, 5, n ; struct komplex c1 = 1.2, 0.8, c2 =.re=0.5,.im=0.33;!!! Vorsicht bei Zugriffen uf eine Struktur die Komponenten immer durch die Komponentennmen identifiziert, bei der Initilisierung nch Reihenfolge ber nur durch die Postion potentielle Fehlerquelle bei Änderungen der Strukturtyp-Deklrtion Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 95 / 115 Jürgen Kleinöder Univ. Erlngen-Nürnberg Informtik 4, 2010 WS 2010/11 96 / 115