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