Inhaltsverzeichnis
Liebe Leser!
Inhaltsverzeichnis
Vorwort
1 Einstieg in die Welt von C
1.1 Die Sprache C
1.2 Die C-Standardbibliothek
1.2.1 Header-Dateien und Programmbibliothek
1.3 Die nötigen Werkzeuge für C
1.4 Übersetzen mit der Entwicklungsumgebung
1.5 Übersetzen mit GCC und Clang
1.6 Listings zum Buch
1.7 Kontrollfragen und Aufgaben im Buch
2 Erste Schritte in C
2.1 Das erste Programm in C
2.2 Die Funktion printf()
2.3 Zeichensätze in C
2.3.1 Basis-Ausführungszeichensatz
2.3.2 Einige wichtige Escape-Sequenzen
2.4 Symbole in C
2.4.1 Bezeichner
2.4.2 Reservierte Schlüsselwörter
2.4.3 Literale
2.4.4 Einfache Begrenzer
2.5 Kommentare
2.6 Kontrollfragen und Aufgaben
3 Basisdatentypen in C
3.1 Variablen
3.2 Deklaration und Definition
3.3 Initialisierung und Zuweisung von Werten
3.4 Datentypen für Ganzzahlen
3.4.1 Vorzeichenlos und vorzeichenbehaftet
3.4.2 Suffixe für Ganzzahlen
3.5 Datentypen für Zeichen
3.5.1 Der Datentyp char
3.5.2 Der Datentyp wchar_t
3.5.3 Unicode-Unterstützung
3.6 Datentypen für Fließkommazahlen
3.6.1 Suffixe für Fließkommazahlen
3.6.2 Komplexe Gleitkommatypen
3.7 Boolescher Datentyp
3.8 Speicherbedarf mit sizeof ermitteln
3.9 Wertebereiche der Datentypen ermitteln
3.9.1 Limits von Integer-Typen
3.9.2 Limits von Fließkommazahlen
3.9.3 Integer-Typen mit fester Größe verwenden
3.9.4 Sicherheit beim Kompilieren mit _static_assert()
3.10 Konstanten erstellen
3.11 Lebensdauer und Sichtbarkeit von Variablen
3.12 void – ein unvollständiger Typ
3.13 Kontrollfragen und Aufgaben
4 Rechnen mit C und Operatoren
4.1 Werte formatiert einlesen mit scanf()
4.2 Operatoren
4.3 Arithmetische Operatoren
4.4 Inkrement- und Dekrementoperator
4.5 Bitoperatoren
4.6 Implizite Typumwandlung
4.6.1 Arithmetische Umwandlung
4.6.2 Typpromotionen
4.7 Explizite Typumwandlung
4.8 Mathematische Funktionen in C
4.9 Kontrollfragen und Aufgaben
5 Bedingte Anweisung und Verzweigung
5.1 Bedingte Anweisungen
5.1.1 Bedingte Anweisungen mit if
5.1.2 Vergleichsoperatoren
5.1.3 Mini-Exkurs: Anweisungsblock
5.2 Die alternative Verzweigung
5.3 Der Bedingungsoperator ?:
5.4 Die mehrfache Verzweigung mit if und else if
5.4.1 Verschachteln von Verzweigungen
5.5 Mehrfache Verzweigung mit switch
5.5.1 Austritt aus der Fallunterscheidung mit break
5.6 Logische Verknüpfungen
5.6.1 Der !-Operator
5.6.2 Der &&-Operator – logisches UND
5.6.3 Der ||-Operator – logisches ODER
5.7 Kontrollfragen und Aufgaben
6 Schleifen – Programmteile wiederholen
6.1 Die Zählschleife – for
6.2 Die kopfgesteuerte while-Schleife
6.3 Die fußgesteuerte do-while-Schleife
6.4 Kontrolliertes Verlassen von Schleifen
6.4.1 break
6.4.2 continue
6.5 Kontrollfragen und Aufgaben
7 Funktionen erstellen
7.1 Funktionen definieren
7.2 Funktionen aufrufen
7.3 Funktionsdeklaration (Vorausdeklaration)
7.4 Funktionsparameter
7.5 Rückgabewert von Funktionen
7.5.1 Die return-Anweisung
7.6 Exkurs: Funktionen bei der Ausführung
7.7 Inline-Funktionen
7.8 Rekursionen
7.9 Die main()-Funktion
7.9.1 Der Rückgabewert von main() an das Betriebssystem
7.10 Programme mit exit() beenden
7.11 Globale, lokale und statische Variablen
7.11.1 Lokale Variablen
7.11.2 Globale Variablen
7.11.3 Speicherklasse static
7.11.4 Die Speicherklasse extern
7.12 Kontrollfragen und Aufgaben
8 Präprozessor-Direktiven
8.1 Dateien einfügen mit #include
8.2 Konstanten und Makros mit #define und #undef
8.2.1 Symbolische Konstanten mit #define definieren
8.2.2 Makros mit #define definieren
8.2.3 Symbolische Konstanten und Makros aufheben (#undef)
8.3 Bedingte Kompilierung
8.3.1 Mehrfaches Inkludieren vermeiden
8.4 Programmdiagnose mit assert()
8.5 Generische Auswahl
8.6 Eigene Header erstellen
8.7 Kontrollfragen und Aufgaben
9 Arrays und Zeichenketten (Strings)
9.1 Was genau sind Arrays?
9.1.1 Arrays definieren
9.1.2 Arrays mit Werten versehen und darauf zugreifen
9.1.3 Initialisierung mit einer Initialisierungsliste
9.1.4 Bestimmte Elemente direkt initialisieren
9.1.5 Array mit Schreibschutz
9.1.6 Arrays mit fester und variabler Länge (VLA) – optional seit C11
9.1.7 Arrays mit scanf einlesen
9.1.8 Arrays an Funktionen übergeben
9.2 Mehrdimensionale Arrays
9.2.1 Zweidimensionalen Arrays Werte zuweisen und darauf zugreifen
9.2.2 Zweidimensionale Arrays an eine Funktion übergeben
9.2.3 Können wir noch mehr Dimensionen verwenden?
9.3 Strings (Zeichenketten)
9.3.1 Strings initialisieren
9.3.2 Einlesen von Strings
9.3.3 Unicode-Unterstützung
9.3.4 String-Funktionen der Standardbibliothek string.h
9.3.5 Sicherere Funktionen zum Schutz vor Speicherüberschreitungen
9.3.6 Umwandlungsfunktionen zwischen Zahlen und Strings
9.4 Kontrollfragen und Aufgaben
10 Zeiger (Pointer)
10.1 Zeiger vereinbaren
10.2 Zeiger verwenden
10.2.1 Explizite Typumwandlung für den byteweisen Zugriff
10.3 Zugriff auf den Inhalt von Zeigern
10.3.1 Der NULL-Zeiger
10.3.2 Deklaration, Adressierung und Dereferenzierung von Zeigern
10.4 Zeiger als Funktionsparameter
10.5 Zeiger als Rückgabewert
10.6 Zeigerarithmetik
10.7 Zugriff auf Array-Elemente über Zeiger
10.8 Arrays und Zeiger als Funktionsparameter
10.8.1 const-Array-Parameter
10.9 char-Arrays und Zeiger
10.10 Arrays von Zeigern
10.11 void-Zeiger
10.12 Typqualifizierer bei Zeigern
10.12.1 Konstanter Zeiger
10.12.2 Zeiger für konstante Daten
10.12.3 Konstante Zeiger und Zeiger für konstante Daten
10.12.4 Konstante Parameter für Funktionen
10.12.5 restrict-Zeiger
10.13 Zeiger auf Funktionen
10.14 Kontrollfragen und Aufgaben
11 Dynamische Speicherverwaltung
11.1 Neuen Speicher zur Laufzeit reservieren
11.2 Speicherblöcke vergrößern oder verkleinern
11.3 Speicherblöcke wieder freigeben
11.3.1 Memory Leaks (Speicherlecks)
11.4 Kontrollfragen und Aufgaben
12 Komplexe Datentypen
12.1 Strukturen
12.1.1 Strukturtypen deklarieren
12.1.2 Definition einer Strukturvariablen
12.1.3 Erlaubte Operationen auf Strukturvariablen
12.1.4 Deklaration und Definition zusammenfassen
12.1.5 Synonyme für Strukturtypen erstellen
12.1.6 Selektion von Komponenten einer Strukturvariablen
12.1.7 Strukturen initialisieren
12.1.8 Nur bestimmte Komponenten einer Strukturvariablen initialisieren
12.1.9 Zuweisung bei Strukturvariablen
12.1.10 Größe und Speicherausrichtung einer Struktur
12.1.11 Strukturen vergleichen
12.1.12 Strukturen, Funktionen und Strukturzeiger
12.1.13 Array von Strukturvariablen
12.1.14 Strukturvariablen als Komponenten in Strukturen
12.1.15 Zeiger als Komponenten in Strukturen
12.2 Unions
12.3 Der Aufzählungstyp enum
12.4 Eigene Typen mit typedef deklarieren
12.5 Kontrollfragen und Aufgaben
13 Dynamische Datenstrukturen
13.1 (Einfach) verkettete Listen
13.1.1 Ein neues Element in die Liste einfügen
13.1.2 Ein Element suchen und ausgeben
13.1.3 Ein Element aus der Liste entfernen
13.1.4 Das erste Element in der Liste löschen
13.1.5 Ein beliebiges Element in der Liste löschen
13.2 Doppelt verkettete Listen
13.3 Kontrollfragen und Aufgaben
14 Eingabe- und Ausgabefunktionen
14.1 Verschiedene Streams und Standard-Streams
14.1.1 Streams im Textmodus
14.1.2 Streams im binären Modus
14.1.3 Standard-Streams
14.2 Dateien
14.3 Dateien öffnen
14.3.1 Exklusiver Dateizugriff
14.3.2 Weitere Dateifunktionen
14.4 Dateien schließen
14.4.1 Limit maximal geöffneter Dateien
14.5 Fehler oder Dateiende prüfen
14.5.1 End-of-File Indicator
14.5.2 Error Indicator
14.5.3 Informationen zum Fehler ausgeben
14.5.4 Fehler- und EOF-Flag zurücksetzen – clearerr()
14.6 Weitere Funktionen für die Ein- und Ausgabe
14.6.1 Einzelne Zeichen aus einem Stream lesen
14.6.2 Zeichen in den Stream zurückstellen
14.6.3 Einzelne Zeichen in einen Stream schreiben
14.6.4 Zeilenweise aus einem Stream lesen
14.6.5 Zeilenweise in einen Stream schreiben
14.6.6 Lesen und Schreiben in ganzen Blöcken
14.7 Funktionen zur formatierten Ein-/Ausgabe
14.7.1 Funktionen zur formatierten Ausgabe
14.7.2 Umwandlungsvorgaben für die printf-Familie
14.7.3 Weite und Feldbreite
14.7.4 Flags
14.7.5 Genauigkeitsangaben für Zahlen bei printf()
14.7.6 Funktionen für die formatierte Eingabe
14.7.7 Umwandlungsvorgaben für die scanf()-Familie
14.7.8 Suchmengenkonvertierung
14.8 Wahlfreier Dateizugriff
14.8.1 Die aktuelle Dateiposition ermitteln
14.8.2 Die aktuelle Dateiposition ändern
14.9 Sicherere Funktionen mit C11
14.10 Datei löschen oder umbenennen
14.11 Pufferung
14.12 Kontrollfragen und Aufgaben
15 Zeitroutinen (time.h)
15.1 Die Funktion clock()
15.2 Erweiterte Zeitfunktionen
15.2.1 Eine Plattformunabhängige delay()-Funktion
15.2.2 Der Datentyp time_t
15.2.3 Der Datentyp struct tm
A Übersichtstabellen wichtiger Sprachelemente
A.1 Operatorpriorität (Operator Precedence)
A.2 Reservierte Schlüsselwörter in C
A.3 Header-Dateien der Standardbibliothek
A.4 Kommandozeilenargumente
A.5 Weiterführende Ressourcen
B Lösungen der Übungsaufgaben
B.1 Antworten und Lösungen zu Kapitel 2
B.2 Antworten und Lösungen zu Kapitel 3
B.3 Antworten und Lösungen zu Kapitel 4
B.4 Antworten und Lösungen zu Kapitel 5
B.5 Antworten und Lösungen zu Kapitel 6
B.6 Antworten und Lösungen zu Kapitel 7
B.7 Antworten und Lösungen zu Kapitel 8
B.8 Antworten und Lösungen zu Kapitel 9
B.9 Antworten und Lösungen zu Kapitel 10
B.10 Antworten und Lösungen zu Kapitel 11
B.11 Antworten und Lösungen zu Kapitel 12
B.12 Antworten und Lösungen zu Kapitel 13
B.13 Antworten und Lösungen zu Kapitel 14
B.14 Antworten und Lösungen zu Kapitel 15
Stichwortverzeichnis
Rechtliche Hinweise
Über die Autoren