Carsten Vogt C für Java- Programmierer mit 59 Bildern, 36 Tabellen und 35 Aufgaben HANSER
Inhalt 1 Einführung 13 Schnelleinstieg 14 1.1 C und Java von den Anfängen bis heute 15 1.1.1 Die Entwicklung von C 15 1.1.1.1 Der Ursprung 15 1.1.1.2 Grundlegende Eigenschaften 16 1.1.1.3 Standards 16 1.1.2 Objektorientierte Nachfolgesprachen 17 1.1.2.1 C++ 17 1.1.2.2 Java 17 1.1.3 Einsatzgebiete von C und Java 18 1.2 C und Java im Sprachvergleich 18 1.2.1 Drei Beispielprogramme 18 1.2.1.1 Einfaches Programm mit Ausgabe 18 1.2.1.2 Programm mit Eingabe und C-spezifischen Datentypen 20 1.2.1.3 Programm mit einer Funktion 21 1.2.2 Eigenschaften von Java vs. Eigenschaften von C 22 1.2.2.1 Tabellarischer Vergleich 22 1.2.2.2 Objektorientierung vs. Prozedurorientierung 23 1.2.2.3 Interpretation vs. Übersetzung 25 1.3 Zu diesem Buch 26 1.3.1 Aufbau 26 1.3.2 Benutzung 27 1.3.3 Weitere Quellen 28 2 Struktur und Übersetzung von C-Programmen 31 Schnelleinstieg 32 2.1 Aufbau von C-Programmen 33 2.1.1 C-Quellcode in einer einzelnen Datei 33 2.1.2 C-Quellcode in mehreren Dateien 34
8 Inhalt 2.2 Übersetzung von C-Programmen 35 2.2.1 Phasen der Übersetzung 35 2.2.2 Modularisierung 37 2.2.3 Übersetzung unter Windows 38 2.2.4 Übersetzung unter UNIX/Linux 39 2.3 Anweisungen des Präprozessors 41 2.3.1 #include: Einfügen von Header-Dateien 41 2.3.2 #define: einfache Ersetzung von Zeichenketten 42 2.3.3 #define: Makros mit Parametern 44 2.3.4 #ifdef, #if: bedingte Übersetzung 45 2.4 Übungsaufgaben 46 3 Kontrollstrukturen 49 Schnelleinstieg 50 3.1 Blöcke 51 3.2 Bedingte Anweisungen 52 3.3 Schleifen 52 3.4 Ausnahmebehandlung 53 3.5 Übungsaufgaben 54 4 Datenorganisation 55 Schnelleinstieg 56 4.1 Skalare Datentypen 57 4.1.1 Zahlen- und Zeichentypen 57 4.1.2 Wahrheitswerte 59 4.1.3 Operationen 60 4.2 Konstanten und Variablen 62 4.2.1 Konstanten 62 4.2.2 Definition und Initialisierung von skalaren Variablen 63 4.2.3 Wertzuweisungen 63 4.3 Arrays 64 4.3.1 Eindimensionale Arrays 64 4.3.2 Mehrdimensionale Arrays 67 4.3.3 Zeichenketten 68 4.3.4 Arrays in C99 70 4.4 Strukturen 71 4.4.1 Grundlegende Eigenschaften von Strukturen 71 4.4.2 Strukturtypen 73 4.4.3 Schachtelung von Strukturen 73 4.5 Unions und Bitfelder 74 4.5.1 Unions 74 4.5.2 Bitfelder 75 4.6 Selbstdefinierte Wert- und Typnamen 77 4.6.1 Aufzählungstypen 77 4.6.2 Der typedef-operator 77 4.7 Übungsaufgaben 79
Inhalt 9 5 Zeiger 81 Schnelleinstieg 82 5.1 Java-Objektvariablen vs. C-Zeigervariablen 83 5.2 Grundlegende Begriffe und Operatoren 85 5.2.1 Speicheradressen und Zeigervariablen 85 5.2.2 Adress- und Dereferenzierungsoperator 87 5.2.3 Zwei Programmbeispiele 89 5.2.4 Ungetypte Zeiger 90 5.3 Adressarithmetik 90 5.3.1 Operationen 90 5.3.2 Adressarithmetik bei Arrays 92 5.3.3 Exkurs: Zeichenkettenvariablen und -konstanten 95 5.4 Dynamische Speicherverwaltung 96 5.4.1 malloc() 96 5.4.1.1 Objekterzeugung in Java vs. Speicherbelegung in C 96 5.4.1.2 Definition von malloc() 97 5.4.2 free() 97 5.4.3 Arrays mit dynamisch bestimmter Größe 98 5.4.4 Zwei Programmbeispiele 99 5.5 Zeiger auf Strukturen 101 5.5.1 Arrays mit Zeigern auf Strukturen 101 5.5.2 Strukturen mit Zeigern auf Strukturen 102 5.6 Zeiger auf Zeiger 104 5.7 Übungsaufgaben 105 6 Funktionen 107 Schnelleinstieg 108 6.1 Java-Methoden vs. C-Funktionen 109 6.2 Schnittstellen 111 6.2.1 Prototypen 111 6.2.2 Weitere Besonderheiten von C 113 6.3 Ausführung 116 6.3.1 Ablauf 116 6.3.2 Parameterübergabe 116 6.3.2.1 Wertaufruf 117 6.3.2.2 Referenzaufruf 117 6.3.2.3 Übergabe von Arrays 119 6.3.3 Ergebnisrückgabe 121 6.4 Das Hauptprogramm main() 122 6.5 Speicherklassen 124 6.5.1 Lokale Variablen 124 6.5.1.1 Automatische Variablen 124 6.5.1.2 Statische Variablen 125 6.5.1.3 Registervariablen 126 6.5.2 Externe Variablen 126 6.5.2.1 Programme in einer einzelnen Datei 127
10 Inhalt 6.5.2.2 Programme in mehreren Dateien 128 6.5.3 Tabellarische Zusammenfassung 130 6.6 Funktionsbibliotheken 130 6.6.1 Definition und Benutzung 130 6.6.2 Die Standardbibliothek 131 6.6.2.1 Funktionen für Zeichen und Zeichenketten 132 6.6.2.2 Mathematische Funktionen 134 6.6.2.3 Betriebssystemnahe Dienste 135 6.7 Nutzungsmöglichkeiten für Fortgeschrittene 137 6.7.1 Zeiger auf Funktionen 137 6.7.2 Funktionen als Parameter 139 6.7.3 Funktionen mit variabler Anzahl von Parametern 140 6.8 Übungsaufgaben 141 7 Eirv/Ausgabe und Dateizugriffe 145 Schnelleinstieg 146 7.1 Grundlegende Konzepte 147 7.1.1 Daten ströme in Java und in C 147 7.1.2 Standarddateien 149 7.1.3 Klassen von E/A-Funktionen 149 7.2 Funktionen für die StandardehW-ausgabe 151 7.2.1 printf(): formatierte Ausgabe 151 7.2.1.1 Grundidee 151 7.2.1.2 Allgemeine Form 152 7.2.1.3 Weitere Beispiele 152 7.2.2 scanf(): formatierte Eingabe 153 7.2.2.1 Grundidee 153 7.2.2.2 Allgemeine Form 154 7.2.2.3 Pufferung der Eingabedaten 155 7.2.2.4 Weitere Beispiele 156 7.2.3 Weitere Funktionen für Zeichen und Zeichenketten 159 7.3 Funktionen für beliebige Datenströme 160 7.3.1 Öffnen und Schließen 160 7.3.2 Ein-/Ausgabe einzelner Zeichen 163 7.3.3 EhWAusgabe von Zeichenketten 164 7.3.4 Formatierte Ein-/Ausgabe 164 7.3.5 Ein-/Ausgabe beliebiger Bytefolgen 165 7.3.6 Wahlfreier Zugriff 167 7.3.7 Spezielle Funktionen 169 7.4 Operationen auf dem Dateisystem 170 7.5 Übungsaufgaben 171 8 Dynamische Datenstrukturen 173 Schnelleinstieg 174 8.1 Dynamische Datenhaltung in Java und in C 175
Inhalt 11 8.2 Listen 176 8.2.1 Eigenschaften 176 8.2.2 Einfach verkettete Listen 177 8.2.2.1 Typ der Knoten 177 8.2.2.2 Durchlaufen einer Liste 178 8.2.2.3 Suchen von Einträgen 179 8.2.2.4 Einfügen von Knoten : 179 8.2.2.5 Entfernen von Knoten 182 8.2.3 Doppelt verkettete Listen 185 8.2.3.1 Typ der Knoten 185 8.2.3.2 Durchlaufen einer Liste 186 8.2.3.3 Suchen von Einträgen 186 8.2.3.4 Einfügen von Knoten 187 8.2.3.5 Entfernen von Knoten 189 8.2.4 Queues und Stacks 191 8.2.4.1 Queues 191 8.2.4.2 Stacks 192 8.3 Hashtabellen 192 8.3.1 Eigenschaften 193 8.3.2 Realisierung in Java und in C 193 8.4 Bäume 195 8.4.1 Eigenschaften 195 8.4.2 Binärbäume 196 8.4.2.1 Eigenschaften und Beispiele 196 8.4.2.2 Realisierung in C 198 8.4.2.3 Durchlaufen eines Binärbaums 199 8.4.2.4 Löschen eines Binärbaums 202 8.4.2.5 Suchen eines Werts in einem Suchbaum 202 8.4.2.6 Einfügen eines Werts in einen Suchbaum 202 8.4.2.7 Löschen eines Werts aus einem Suchbaum 204 8.5 Mengen 206 8.5.1 Realisierung durch Listen und Bäume 206 8.5.1.1 Grundlegende Mengenoperationen auf C-Listen 206 8.5.1.2 Bilden der Vereinigungsmenge 207 8.5.1.3 Bilden der Differenzmenge 208 8.5.1.4 Bilden der Schnittmenge 209 8.5.2 Realisierung durch Bitmaps 209 8.6 Übungsaufgaben 212 A Auswertung von Ausdrücken 213 A.l Implizite Typkonversionen 213 A.l.l Konversionen in Rechenausdrücken 213 A.l.2 Konversionen bei Zuweisungen 214 A.2 Sequenzpunkte 216 A.3 Bindungsstärken und Auswertungsreihenfolgen 216
12 Inhalt B Vordefinierte Konstanten 217 B.l Wertebereiche der skalaren Typen 217 B.2 Mathematische Konstanten 218 C Standardbibliothek 219 C.l Dateizugriffe und Ein-/Ausgabe 219 C.l.l Thematische Übersicht über die Funktionen 219 C.l.2 Funktionen in alphabetischer Reihenfolge 221 C.2 Zeichen, Zeichenketten und Bytefolgen 233 C.2.1 Test einzelner Zeichen 233 C.2.2 Umwandlung von Zeichen 234 C.2.3 Zeichenketten 234 C.2.4 Bytefolgen/Arrays 235 C.2.5 Konversionen 236 C.3 Mathematische Funktionen 237 C.4 Betriebssystemnahe Dienste 238 C.4.1 Dynamische Speicherverwaltung 238 C.4.2 Zeitfunktionen 239 C.4.3 Weitere Funktionen 240 D Häufig gebrauchte Tabellen 241 D.l ASCII 241 D.2 Variablengrößen und Wertebereiche 242 D.3 Bindungsstärke von Operatoren 243 D.4 Optionen für fopen() 244 D.5 Konversionsangaben für die Ein-/Ausgabe 245 D.5.1 printf() 245 D.5.2 scanf() 247 Literatur und Internet 248 Index 251