Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
Materialien zum Buch
16
Vorwort
17
1 Der Einstieg in die Welt von C
21
1.1 Die Sprache C
21
1.2 Die C-Standardbibliothek
23
1.2.1 Header-Dateien und Programmbibliothek
24
1.3 Die nötigen Werkzeuge für C
28
1.4 Übersetzen mit der Entwicklungsumgebung
32
1.5 Übersetzen mit GCC und Clang
35
1.6 Listings zum Buch
37
1.7 Kontrollfragen und Aufgaben im Buch
38
1.8 Aufgabe
38
2 Erste Schritte in C
41
2.1 Das erste Programm genauer betrachtet
41
2.2 Die Funktion printf()
44
2.3 Zeichensätze in C
46
2.3.1 Basis-Ausführungszeichensatz
46
2.3.2 Einige wichtige Escape-Sequenzen
47
2.4 Symbole in C
49
2.4.1 Bezeichner
49
2.4.2 Reservierte Schlüsselwörter
51
2.4.3 Literale
52
2.4.4 Einfache Begrenzer
54
2.5 Kommentare
55
2.6 Kontrollfragen und Aufgaben
56
3 Basisdatentypen in C
59
3.1 Variablen
59
3.2 Deklaration und Definition
60
3.3 Initialisierung und Zuweisung von Werten
62
3.4 Datentypen für Ganzzahlen
63
3.4.1 Vorzeichenlos und vorzeichenbehaftet
66
3.4.2 Suffixe für Ganzzahlen
69
3.5 Datentypen für Zeichen
70
3.5.1 Der Datentyp char
71
3.5.2 Der Datentyp wchar_t
72
3.5.3 Unicode-Unterstützung
73
3.6 Datentypen für Fließkommazahlen
74
3.6.1 Suffixe für Fließkommazahlen
76
3.6.2 Komplexe Gleitkommatypen
76
3.7 Boolescher Datentyp
78
3.8 Speicherbedarf mit sizeof ermitteln
80
3.9 Die Wertebereiche der Datentypen ermitteln
82
3.9.1 Limits von Integer-Typen
83
3.9.2 Limits von Fließkommazahlen
85
3.9.3 Integer-Typen mit fester Größe verwenden
86
3.9.4 Sicherheit beim Kompilieren mit static_assert
87
3.10 Konstanten erstellen
88
3.11 Lebensdauer und Sichtbarkeit von Variablen
89
3.12 void – ein unvollständiger Typ
91
3.13 Kontrollfragen und Aufgaben
91
4 Rechnen mit C und Operatoren
93
4.1 Werte formatiert einlesen mit scanf()
93
4.2 Operatoren
97
4.3 Arithmetische Operatoren
101
4.4 Der Inkrement- und der Dekrement-Operator
103
4.5 Bit-Operatoren
106
4.6 Implizite Typumwandlung
112
4.6.1 Arithmetische Umwandlung
113
4.6.2 Typpromotionen
115
4.7 Explizite Typumwandlung
116
4.8 Mathematische Funktionen in C
117
4.9 Kontrollfragen und Aufgaben
121
5 Bedingte Anweisungen und Verzweigungen
125
5.1 Bedingte Anweisungen
125
5.1.1 Bedingte Anweisungen mit if
126
5.1.2 Vergleichsoperatoren
128
5.1.3 Mini-Exkurs zum Anweisungsblock
131
5.2 Die alternative Verzweigung
131
5.3 Der Bedingungsoperator ?:
134
5.4 Die mehrfache Verzweigung mit if und else if
135
5.4.1 Verschachteln von Verzweigungen
138
5.5 Mehrfache Verzweigung mit switch
140
5.5.1 Austritt aus der Fallunterscheidung mit break
143
5.6 Logische Verknüpfungen
147
5.6.1 Der !-Operator
147
5.6.2 Der &&-Operator – Logisches UND
150
5.6.3 Der ||-Operator – Logisches ODER
151
5.7 Kontrollfragen und Aufgaben
154
6 Schleifen – Programmteile wiederholen
157
6.1 Die Zählschleife – for
157
6.2 Die kopfgesteuerte while-Schleife
162
6.3 Die fußgesteuerte do-while-Schleife
165
6.4 Kontrolliertes Verlassen von Schleifen
168
6.4.1 break
168
6.4.2 continue
169
6.5 Kontrollfragen und Aufgaben
171
7 Funktionen erstellen
173
7.1 Funktionen definieren
174
7.2 Funktionen aufrufen
175
7.3 Funktionsdeklaration (Vorausdeklaration)
176
7.4 Funktionsparameter
179
7.5 Rückgabewert von Funktionen
181
7.5.1 Die return-Anweisung
183
7.6 Exkurs: Funktionen bei der Ausführung
185
7.7 Inline-Funktionen
186
7.8 Rekursionen
188
7.9 Die main()-Funktion
190
7.9.1 Der Rückgabewert von main() an das Betriebssystem
190
7.10 Programme mit exit() beenden
192
7.11 Globale, lokale und statische Variablen
194
7.11.1 Lokale Variablen
195
7.11.2 Globale Variablen
196
7.11.3 Die Speicherklasse static
199
7.11.4 Die Speicherklasse extern
202
7.12 Kontrollfragen und Aufgaben
202
8 Präprozessor-Direktiven
205
8.1 Dateien einfügen mit #include
206
8.2 Konstanten und Makros mit #define und #undef
208
8.2.1 Symbolische Konstanten mit #define definieren
208
8.2.2 Makros mit #define definieren
211
8.2.3 Symbolische Konstanten und Makros aufheben (#undef)
214
8.3 Bedingte Kompilierung
215
8.3.1 Mehrfaches Inkludieren vermeiden
218
8.4 Programmdiagnose mit assert()
222
8.5 Generische Auswahl
223
8.6 Eigene Header-Dateien erstellen
225
8.7 Kontrollfragen und Aufgaben
227
9 Arrays und Zeichenketten (Strings)
231
9.1 Was genau sind Arrays?
231
9.1.1 Arrays definieren
232
9.1.2 Arrays mit Werten versehen und auf sie zugreifen
233
9.1.3 Initialisierung mit einer Initialisierungsliste
238
9.1.4 Bestimmte Elemente direkt initialisieren
239
9.1.5 Arrays mit Schreibschutz
240
9.1.6 Arrays mit fester und variabler Länge (VLA)
240
9.1.7 Arrays mit scanf einlesen
242
9.1.8 Arrays an Funktionen übergeben
243
9.2 Mehrdimensionale Arrays
245
9.2.1 Zweidimensionalen Arrays Werte zuweisen und auf sie zugreifen
246
9.2.2 Zweidimensionale Arrays an eine Funktion übergeben
249
9.2.3 Mehr als zwei Dimensionen verwenden
251
9.3 Strings (Zeichenketten)
252
9.3.1 Strings initialisieren
252
9.3.2 Strings einlesen
254
9.3.3 Unicode-Unterstützung
256
9.3.4 String-Funktionen der Standardbibliothek <string.h>
258
9.3.5 Sicherere Funktionen zum Schutz vor Speicherüberschreitungen
261
9.3.6 Umwandlungsfunktionen zwischen Zahlen und Strings
261
9.4 Kontrollfragen und Aufgaben
262
10 Zeiger (Pointer)
265
10.1 Zeiger vereinbaren
265
10.2 Zeiger verwenden
267
10.2.1 Explizite Typumwandlung für den byteweisen Zugriff
268
10.3 Zugriff auf den Inhalt von Zeigern
269
10.3.1 Der NULL-Zeiger
272
10.3.2 Deklaration, Adressierung und Dereferenzierung von Zeigern
273
10.4 Zeiger als Funktionsparameter
274
10.5 Zeiger als Rückgabewert
275
10.6 Zeigerarithmetik
278
10.7 Zugriff auf Array-Elemente über Zeiger
279
10.8 Arrays und Zeiger als Funktionsparameter
283
10.8.1 Der const-Array-Parameter
283
10.9 char-Arrays und Zeiger
285
10.10 Arrays von Zeigern
287
10.11 void-Zeiger
290
10.12 Typqualifizierer bei Zeigern
291
10.12.1 Konstanter Zeiger
291
10.12.2 Zeiger für konstante Daten
292
10.12.3 Konstante Zeiger und Zeiger für konstante Daten
293
10.12.4 Konstante Parameter für Funktionen
293
10.12.5 restrict-Zeiger
294
10.13 Zeiger auf Funktionen
296
10.14 Kontrollfragen und Aufgaben
300
11 Dynamische Speicherverwaltung
303
11.1 Neuen Speicher zur Laufzeit reservieren
304
11.2 Speicherblöcke vergrößern oder verkleinern
310
11.3 Speicherblöcke wieder freigeben
314
11.3.1 Memory Leaks (Speicherlecks)
315
11.4 Kontrollfragen und Aufgaben
317
12 Komplexe Datentypen
319
12.1 Strukturen
320
12.1.1 Strukturtypen deklarieren
320
12.1.2 Definition einer Strukturvariablen
322
12.1.3 Erlaubte Operationen auf Strukturvariablen
323
12.1.4 Deklaration und Definition zusammenfassen
323
12.1.5 Synonyme für Strukturtypen erstellen
324
12.1.6 Selektion von Komponenten einer Strukturvariablen
325
12.1.7 Strukturen initialisieren
329
12.1.8 Nur bestimmte Komponenten einer Strukturvariablen initialisieren
330
12.1.9 Zuweisung bei Strukturvariablen
331
12.1.10 Größe und Speicherausrichtung einer Struktur
331
12.1.11 Strukturen vergleichen
332
12.1.12 Strukturen, Funktionen und Strukturzeiger
332
12.1.13 Arrays von Strukturvariablen
336
12.1.14 Strukturvariablen als Komponenten in Strukturen
339
12.1.15 Zeiger als Komponenten in Strukturen
345
12.2 Unions
348
12.3 Der Aufzählungstyp enum
351
12.4 Eigene Typen mit typedef deklarieren
353
12.5 Kontrollfragen und Aufgaben
355
13 Dynamische Datenstrukturen
359
13.1 Einfach verkettete Listen
360
13.1.1 Ein neues Element in die Liste einfügen
366
13.1.2 Ein Element suchen und ausgeben
369
13.1.3 Ein Element aus der Liste entfernen
370
13.1.4 Das erste Element in der Liste löschen
371
13.1.5 Ein beliebiges Element in der Liste löschen
372
13.2 Doppelt verkettete Listen
373
13.3 Kontrollfragen und Aufgaben
375
14 Eingabe- und Ausgabefunktionen
377
14.1 Verschiedene Streams und Standard-Streams
377
14.1.1 Streams im Textmodus
378
14.1.2 Streams im binären Modus
379
14.1.3 Standard-Streams
379
14.2 Dateien
380
14.3 Dateien öffnen
382
14.3.1 Exklusiver Dateizugriff
385
14.3.2 Weitere Dateifunktionen
386
14.4 Dateien schließen
388
14.4.1 Das Limit für maximal geöffnete Dateien
388
14.5 Auf Fehler oder das Dateiende prüfen
389
14.5.1 Der End-of-File Indicator
389
14.5.2 Error Indicator
390
14.5.3 Informationen zum Fehler ausgeben
390
14.5.4 Fehler- und EOF-Flag zurücksetzen – clearerr()
391
14.6 Weitere Funktionen für die Ein- und Ausgabe
391
14.6.1 Einzelne Zeichen aus einem Stream lesen
392
14.6.2 Zeichen in den Stream zurückstellen
392
14.6.3 Einzelne Zeichen in einen Stream schreiben
392
14.6.4 Zeilenweise aus einem Stream lesen
395
14.6.5 Zeilenweise in einen Stream schreiben
395
14.6.6 Lesen und Schreiben in ganzen Blöcken
400
14.7 Funktionen zur formatierten Ein-/Ausgabe
405
14.7.1 Funktionen zur formatierten Ausgabe
405
14.7.2 Umwandlungsvorgaben für die printf-Familie
407
14.7.3 Weite und Feldbreite
408
14.7.4 Flags
409
14.7.5 Genauigkeitsangaben für Zahlen bei printf()
410
14.7.6 Funktionen für die formatierte Eingabe
414
14.7.7 Umwandlungsvorgaben für die scanf()-Familie
415
14.7.8 Suchmengenkonvertierung
416
14.8 Wahlfreier Dateizugriff
418
14.8.1 Die aktuelle Dateiposition ermitteln
418
14.8.2 Die aktuelle Dateiposition ändern
418
14.9 Sicherere Funktionen mit C11
422
14.10 Datei löschen oder umbenennen
423
14.11 Pufferung
423
14.12 Kontrollfragen und Aufgaben
425
15 Zeitroutinen (time.h)
429
15.1 Die Funktion clock()
429
15.2 Erweiterte Zeitfunktionen
431
15.2.1 Eine plattformunabhängige delay()-Funktion
433
15.2.2 Der Datentyp time_t
434
15.2.3 Der Datentyp struct tm
436
15.3 Kontrollfragen und Aufgaben
441
15.4 Schlusswort
443
Anhang
445
A Übersichtstabellen wichtiger Sprachelemente
445
A.1 Operatorpriorität (Operator Precedence)
445
A.2 Reservierte Schlüsselwörter in C
447
A.3 Header-Dateien der Standardbibliothek
448
A.4 Kommandozeilenargumente
451
A.5 Weiterführende Ressourcen
454
B Lösungen der Übungsaufgaben
455
B.1 Antworten und Lösungen zu Kapitel 2
455
B.2 Antworten und Lösungen zu Kapitel 3
456
B.3 Antworten und Lösungen zu Kapitel 4
457
B.4 Antworten und Lösungen zu Kapitel 5
459
B.5 Antworten und Lösungen zu Kapitel 6
461
B.6 Antworten und Lösungen zu Kapitel 7
464
B.7 Antworten und Lösungen zu Kapitel 8
467
B.8 Antworten und Lösungen zu Kapitel 9
470
B.9 Antworten und Lösungen zu Kapitel 10
474
B.10 Antworten und Lösungen zu Kapitel 11
480
B.11 Antworten und Lösungen zu Kapitel 12
484
B.12 Antworten und Lösungen zu Kapitel 13
487
B.13 Antworten und Lösungen zu Kapitel 14
492
B.14 Antworten und Lösungen zu Kapitel 15
495
Index
499