Wolf / Krooß | Grundkurs C | E-Book | www2.sack.de
E-Book

E-Book, Deutsch, 506 Seiten

Reihe: Rheinwerk Computing

Wolf / Krooß Grundkurs C


4. Auflage 2024
ISBN: 978-3-367-10442-0
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection

E-Book, Deutsch, 506 Seiten

Reihe: Rheinwerk Computing

ISBN: 978-3-367-10442-0
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection



Programmierung mit C auf den Punkt gebracht – der praktische Grundkurs

Das komplette Grundwissen zur C-Programmierung im praktischen Taschenbuchformat. In diesem Grundkurs lernen Sie alles, was Sie über C-Programmierung wissen müssen – zum Beispiel im Studium oder in der Ausbildung zum Fachinformatiker. Verständlich und auf den Punkt erfahren Sie, wie Sie robusten C-Code schreiben und Software in C entwickeln . Ideal zum Auffrischen Ihrer Programmierkenntnisse.

Operatoren, Arrays, Schleifen – die Themen sind in Kapitel aufgeteilt, die aufeinander aufbauen: Zuerst lernen Sie die Sprachgrundlagen kennen, dann gehen Sie mit komplexeren Themen wie Zeigern oder dynamischer Speicherverwaltung stärker in die Tiefe. So schaffen Sie sich ein Fundament für Ihre C-Projekte . Am Ende jedes Kapitels testen Sie Ihr Wissen in Übungen und vergleichen Ihre Ergebnisse mit der kommentierten Lösung. Viele Codebeispiele, Tabellen sowie eine Funktionsreferenz erleichtern Ihnen das Lernen. Die vierte Auflage des Buchs berücksichtigt den aktuellen Standard C23.

  • Kompakter Programmierkurs, komplettes Grundwissen
  • Von den ersten Schritten bis zum komplexen Programm
  • Mit Codebeispielen, Übungen und Lösungen zum Selbstlernen

Aus dem Inhalt:

  • Erste Schritte in C
  • Verzweigungen und Schleifen
  • Funktionen
  • Präprozessor-Direktiven
  • Arrays und Zeichenketten
  • Zeiger
  • Dynamische Speicherverwaltung
  • Dynamische Datenstrukturen
  • Eingabe- und Ausgabe-Funktionen
  • Aktueller ISO-Standard C23
Wolf / Krooß Grundkurs C jetzt bestellen!

Weitere Infos & Material


  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.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.4 ... Symbole in C ... 49

       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.5 ... Datentypen für Zeichen ... 70

       3.6 ... Datentypen für Fließkommazahlen ... 74

       3.7 ... Boolescher Datentyp ... 78

       3.8 ... Speicherbedarf mit sizeof ermitteln ... 80

       3.9 ... Die Wertebereiche der Datentypen ermitteln ... 82

       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.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.2 ... Die alternative Verzweigung ... 131

       5.3 ... Der Bedingungsoperator ?: ... 134

       5.4 ... Die mehrfache Verzweigung mit if und else if ... 135

       5.5 ... Mehrfache Verzweigung mit switch ... 140

       5.6 ... Logische Verknüpfungen ... 147

       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.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.6 ... Exkurs: Funktionen bei der Ausführung ... 185

       7.7 ... Inline-Funktionen ... 186

       7.8 ... Rekursionen ... 188

       7.9 ... Die main()-Funktion ... 190

       7.10 ... Programme mit exit() beenden ... 192

       7.11 ... Globale, lokale und statische Variablen ... 194

       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.3 ... Bedingte Kompilierung ... 215

       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.2 ... Mehrdimensionale Arrays ... 245

       9.3 ... Strings (Zeichenketten) ... 252

       9.4 ... Kontrollfragen und Aufgaben ... 262

10.  Zeiger (Pointer) ... 265


       10.1 ... Zeiger vereinbaren ... 265

       10.2 ... Zeiger verwenden ... 267

       10.3 ... Zugriff auf den Inhalt von Zeigern ... 269

       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.9 ... char-Arrays und Zeiger ... 285

       10.10 ... Arrays von Zeigern ... 287

       10.11 ... void-Zeiger ... 290

       10.12 ... Typqualifizierer bei Zeigern ... 291

       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.4 ... Kontrollfragen und Aufgaben ... 317

12.  Komplexe Datentypen ... 319


       12.1 ... Strukturen ... 320

       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.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.2 ... Dateien ... 380

       14.3 ... Dateien öffnen ... 382

       14.4 ... Dateien schließen ... 388

       14.5 ... Auf Fehler oder das Dateiende prüfen ... 389

       14.6 ... Weitere Funktionen für die Ein- und Ausgabe ... 391

       14.7 ... Funktionen zur formatierten Ein-/Ausgabe ... 405

       14.8 ... Wahlfreier Dateizugriff ... 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.3 ... Kontrollfragen und Aufgaben ... 441

       15.4 ... Schlusswort ... 443

  Anhang ... 445


       A ... Übersichtstabellen wichtiger Sprachelemente ... 445

       B ... Lösungen der Übungsaufgaben ... 455

  Index ... 499


1.2    Die C-Standardbibliothek


Auch wenn dieses Buch wie schon gesagt keine Referenz für die Standardbibliothek enthält, sollten Sie dennoch ihren Sinn kennen, denn so haben Sie es später leichter. Der Sprachkern von C bietet nämlich keinerlei erweiterte Funktionen. Dies zu verschweigen, könnte zu Irritationen führen, die wir Ihnen natürlich ersparen wollen. Weil C so kompakt wie möglich sein soll, bietet der Sprachkern – im Gegensatz zu mancher anderen Programmiersprache – nicht einmal eine direkte Unterstützung für die Ein- und Ausgabe über die Tastatur oder den Bildschirm! Hierzu werden extra Module von der Standardbibliothek angeboten. In welchem Umfang die Standardbibliothek vorhanden sein muss, hängt von Ihrer Umgebung ab. So bietet z. B. der C-Compiler für einen Mikrocontroller wie den Arduino keine direkte Anbindung an externe Bildschirme, der GCC-Compiler für Linux hingegen schon.

Bei einer betriebssystemgestützten Implementierung, mit der es wohl die meisten von Ihnen beim Erlernen der Sprache C zunächst zu tun haben, muss die C-Standardbibliothek in vollem Umfang vorhanden sein, wenn ein Compiler sich als standardkonform bezeichnen will. Die betriebssystemgestützte Implementierung wird auch als Hosted Environment bezeichnet. Das Betriebssystem wird oft als Host (Gast) bezeichnet, von dem sich der C-Compiler Funktionen – wie z. B. die Zeicheneingabe über die Tastatur – leiht. Was ein Compiler ist und wie er funktioniert, erklären wir natürlich ebenfalls.

Wenn Sie C im Embedded-Bereich verwenden, haben Sie es in der Regel mit einer sogenannten freistehenden Implementierung zu tun. Diese Form der Umgebung muss nur einen bestimmten Teil der Standardbibliothek anbieten, damit sie als standardkonform bezeichnet werden kann. Die freistehende Implementierung bzw. freistehende Umgebung wird auch als Freestanding Environment bezeichnet. Eine solche Umgebung ist beispielsweise die Arduino-IDE. In diesem Buch werden wir natürlich nicht auf den Arduino oder andere Mikrocontroller eingehen; zu ihnen gibt es gesonderte Literatur. Dennoch können Sie, wenn Sie C auf Ihrem PC lernen, nach ein wenig Üben auch C-Programme für den Arduino erstellen.

1.2.1    Header-Dateien und Programmbibliothek


Der Aufbau der Standardbibliothek bleibt Ihnen beim Entwickeln häufig verborgen. Dies ist auch gut so, denn Sie wollen ja schließlich nicht stets den ganzen Quellcode von stdio.h sehen müssen, wenn Sie nur »Hallo Welt« auf dem Bildschirm ausgeben wollen. stdio.h ist die Header-Datei aus der Standardbibliothek, die für die Bildschirmausgabe gebraucht wird. Header-Dateien werden in den folgenden Kapiteln noch ausführlich besprochen. An dieser Stelle ist es uns nur wichtig, dass Sie verstehen, dass die C-Bibliothek aus vielen unterschiedlichen Modulen besteht, die Sie bei Bedarf per Hand hinzufügen können.

In den kommenden Programmen werden Sie bei jedem Beispiel sogenannte Header-Dateien mit der Dateiendung *.h hinzufügen. In diesen Header-Dateien werden unter anderem fertige Funktionen angeboten, die im weiteren Verlauf verwendet werden können, wenn die Header-Datei eingebunden wurde. Somit müssen Sie viele Funktionen nicht selbst programmieren, sondern können diese schlicht mit einer einzigen Programmzeile aufrufen. Wie Sie Funktionen aufrufen und Parameter an sie übergeben (und natürlich, was Parameter sind), ist auch Thema dieses Buches.

Der tatsächliche Inhalt bzw. die Implementation der Funktionen ist in die Programmbibliothek ausgelagert. Genau deshalb müssen Sie den entsprechenden Quellcode auch nicht sehen, wenn Sie dies nicht wollen. Der Quellcode oder Quelltext bezeichnet das C-Programm, und zwar genau so, wie Sie es eingegeben haben.

Bei Header-Dateien und der Programmbibliothek handelt es sich also um zwei unterschiedliche Dinge: Meistens sind Header-Dateien separate einzelne Dateien, deren Namensgebung vom Standard vorgegeben wird. Die Implementierung der Programmbibliothek wird hingegen in der Regel vom Compiler-Hersteller verwaltet und kann daher variieren. Manchmal gibt es auch zusätzliche Bibliotheken, die über die Standardbibliothek hinausgehen, wie z. B. die Windows-API. Die Windows-API wurde von Microsoft entwickelt, um Standardfunktionen von Windows (wie z. B. das Verwalten von Fenstern) für jeden Anwendungsentwickler verfügbar zu machen. Unter Linux ist z. B. das GTK-Toolkit ein Beispiel für über den Standard hinausgehende Bibliotheken für sogenannte GUI-Anwendungen. GUI ist die Abkürzung für Graphic User Interface und bezeichnet allgemein eine grafische Benutzeroberfläche mit Fenstern und Symbolen.

Übersicht über die Header-Dateien

In Tabelle 1.1 finden Sie einen Überblick über die verschiedenen Header-Dateien, die Ihnen seit C11 zur Verfügung stehen. Da es wohl immer noch Compiler gibt, in die der C11-Standard nur teilweise bis gar nicht implementiert wurde, sehen Sie auch, ab welchem Standard die entsprechende Header-Datei der Standardbibliothek vorhanden ist.

Header-Datei

(* = veraltet, wird evtl. später entfernt oder ergänzt.)

Verfügbar seit Standard

Bedeutung

C89/C90

Assertions; Fehlersuche

C99

komplexe Zahlenarithmetik

C89/C90

Test auf bestimmte Zeichentypen

C89/C90

Makros mit Fehlercodes

C99

Einstellungen für die Gleitkommaberechnungen

C89/C90

Limits und Funktionen für Gleitkommazahlen

C99

Konvertierungsfunktionen für Ganzzahltypen

C95/NA1

alternative Schreibweise für logische und bitweise Operatoren

...


Wolf, Jürgen
Jürgen Wolf ist seit über 20 Jahren Autor und seit mehr als 10 Jahren passionierter Digitalfotograf. Seine Buchthemen sind Bildbearbeitung, Fotografie, Webentwicklung, Betriebssysteme und Programmierung. Und egal welches Thema: Bei jedem Buch ist es sein Ziel, auch komplexe Zusammenhänge klar und verständlich zu erklären.

Krooß, René
René Krooß ist Diplom-Informatiker, begeisterter Programmierer und Experte für Prozessorstrukturen, Betriebssysteme, Hardware-Programmierung und Algorithmen. Sein Hobby: die Videobearbeitung mit professioneller Software wie Magix Video Deluxe. Sein Ziel: Einsteigern und Fortgeschrittenen einen einfachen Zugang zu C zu ermöglichen.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.