O'Reilly logo

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

C von Kopf bis Fuß

Book Description

Schon mal davon geträumt, C zu lernen und dabei Spaß zu haben? Mit C von Kopf bis Fuß kann dieser Traum wahr werden: Die einzigartige Methode dieses Arbeitsbuchs setzt auf die spielerische, visuell abwechslungsreiche Vermittlung von Wissen und orientiert dabei sich an den neuesten Lerntheorien. Das Buch bietet Ihnen dabei ein unterhaltsames Lernerlebnis -- und spielt Ihnen C direkt ins Hirn.

C von Kopf bis Fuß behandelt nicht nur alle Basics wie die Sprachgrundlagen, Zeiger und Zeigerarithmetik sowie die dynamische Speicherverwaltung, sondern auch fortgeschrittene Themen wie Multithreading und Netzwerkprogrammierung. Darüber hinaus können Sie anhand von konkreten Workshops mehr in die Tiefe gehen, Programmiertechniken einüben und Ihre neuen Fähigkeiten auf die Probe stellen. C von Kopf bis Fuß macht Ihnen das Erlernen der Sprache nicht nur leichter, es hilft Ihnen auch, ein richtig guter C-Programmierer zu werden.

Table of Contents

  1. C von Kopf bis Fuß
  2. Widmung
  3. Die Autoren von C von Kopf bis Fuß
  4. Über den Übersetzer dieses Buchs
  5. Wie man dieses Buch benutzt: Einführung
    1. Für wen ist dieses Buch?
      1. Wer sollte eher die Finger von diesem Buch lassen?
    2. Wir wissen, was Sie gerade denken
    3. Und wir wissen, was Ihr Gehirn gerade denkt
    4. Metakognition: Nachdenken übers Denken
    5. Das haben WIR getan
    6. Und das können SIE tun, um sich Ihr Gehirn untertan zu machen
    7. Lies mich
    8. Die technischen Gutachter
    9. Danksagungen
  6. 1. Erste Schritte mit C: Eintauchen
    1. C, die Sprache für kleine, schnelle Programme
      1. Wie C funktioniert
    2. Aber wie sieht ein vollständiges C-Programm aus?
    3. Und wie führen Sie das Programm aus?
      1. Das Programm funktioniert!
    4. Zwei Arten von Befehlen
      1. Etwas tun
      2. Etwas tun, wenn etwas zutrifft
    5. So sieht der Code bislang aus
    6. Kartenzählen? In C?
    7. Vergleiche kennen nicht nur Gleichheit ...
      1. && prüft, ob zwei Bedingungen zutreffen
      2. II prüft, ob eine Bedingung zutrifft
      3. ! kehrt den Wert der Bedingung um
    8. Wie sieht der Code jetzt aus?
    9. Weichen stellen
    10. Wenn einmal keinmal ist ...
      1. In C while-Schleifen nutzen
    11. Schleifen haben oft eine ähnliche Struktur ...
      1. ... und die for-Schleife vereinfacht das
    12. Mit break ausbrechen ...
      1. ... und mit continue fortsetzen
    13. Ihr C-Werkzeugkasten
  7. 2. Speicher und Zeiger: Worauf zeigst du?
    1. C-Code enthält Zeiger
    2. Ein Blick in den Speicher
    3. Segel setzen mit Zeigern
    4. Kurs Südost, Kapitän
    5. Versuchen wir, der Variablen einen Zeiger zu übergeben
      1. Zeiger vereinfachen das Teilen von Speicher
    6. Speicherzeiger einsetzen
    7. Wie übergibt man einer Funktion einen String?
      1. Schatz, wer hat den String geschrumpft?
    8. Array-Variablen sind wie Zeiger ...
      1. ... unsere Funktion erhielt also einen Zeiger
    9. Was der Computer denkt, wenn er Ihren Code ausführt
    10. Aber Array-Variablen sind nicht das Gleiche wie Zeiger
    11. Warum Arrays wirklich mit 0 beginnen
    12. Warum Zeiger Typen haben
    13. Zeiger für die Dateneingabe verwenden
      1. Mit scanf() Zahlen eingeben
    14. Aufgepasst mit scanf()
      1. scanf() kann zu Pufferüberläufen führen
    15. fgets() ist eine Alternative zu scanf()
      1. sizeof mit fgets() verwenden
    16. Bereit zu einer Runde Kümmelblättchen?
    17. Oh ... es gibt ein Speicherproblem ...
    18. Stringliterale können nie aktualisiert werden
    19. Im Speicher: char *karten=“BDK”;
    20. Wenn Sie einen String ändern wollen, kopieren Sie ihn
    21. Im Speicher: char karten[]=“BDK”;
    22. Speicher speichern
      1. Stack
      2. Heap
      3. Globales
      4. Konstanten
      5. Code
    23. Ihr C-Werkzeugkasten
  8. 3. Strings: Stringtheorie
    1. Suse Frank verzweifelt gesucht
    2. Ein Array mit Arrays erstellen
    3. Strings finden, die den Suchtext enthalten
      1. string.h
    4. Die Funktion strstr() einsetzen
    5. Zeit, dass wir uns unseren Code ansehen
    6. Array von Arrays vs. Array von Zeigern
    7. Ihr C-Werkzeugkasten
  9. 4. Kleine Werkzeuge erstellen: Eine Sache tun, und zwar gut
    1. Kleine Werkzeuge können große Probleme lösen
    2. So sollte das Programm funktionieren
    3. Aber Sie nutzen noch keine Dateien ...
    4. Sie können Ihre Daten umleiten
    5. Die Standardeingabe leitet man mit < um ...
    6. ... und die Standardausgabe mit >
    7. Aber es gibt ein Problem mit einigen Daten ...
    8. Die Standardfehlerausgabe
    9. Standardmäßig wird die Standardfehlerausgabe an den Bildschirm gebunden
    10. fprintf() schreibt in einen Datenstrom
    11. Aktualisieren wir den Code, damit er fprintf() nutzt
    12. Kleine Werkzeuge sind flexibel
    13. Ändern Sie geo2json nicht
    14. Eine andere Aufgabe erfordert ein anderes Werkzeug
    15. Eingaben und Ausgaben mit einer Pipe verbinden
    16. Das bermuda-Werkzeug
    17. Aber was ist, wenn Sie mehr als eine Datei ausgeben wollen?
    18. Der eigene Datenstrom
      1. Das Programm läuft, aber ...
    19. main() kann mehr
    20. In der Von Kopf bis Fuß-Pizzeria aufgeschnappt
    21. Lassen Sie die Bibliothek für sich arbeiten
    22. Ihr C-Werkzeugkasten
  10. 5. Mehrere Quelldateien: Zerlegen und zusammenbauen
    1. Großes darf man nicht in Kleines stecken
    2. Mit Casts floats in ganze Zahlen packen
    3. Oh nein, arbeitslose Schauspieler am Werk ...
    4. Schauen wir uns an, was dem Code widerfahren ist
    5. Compiler mögen keine Überraschungen
      1. Das Reparieren der Funktionsabfolge ist eine Qual
      2. Manchmal gibt es keine richtige Reihenfolge
    6. Die Deklaration von der Definition trennen
    7. Ihre erste Header-Datei
    8. Bei Gemeinsamkeiten ...
      1. ... ist teilen gut
    9. Sie können Code auf mehrere Dateien aufteilen
    10. Kompilieren – was steckt dahinter?
    11. Der gemeinsame Code braucht einen Header
      1. kodieren.h in Ihr Programm einschließen
    12. Es ist kein Mysterium ... oder doch?
    13. Nicht alles neu kompilieren
      1. Kopien des generierten Codes speichern
    14. Erst aus Quellen Objektdateien machen
      1. Dann Objektdateien linken
    15. Das Nachhalten der Dateien ist aufwendig
    16. Die Erstellung mit make automatisieren
      1. Was muss make wissen?
    17. Wie make funktioniert
    18. make mit einem makefile über Ihren Code informieren
    19. Abheben!
    20. Ihr C-Werkzeugkasten
  11. I. C-Workshop: Arduino
    1. 6. Structs, Unions und Bitfelder: Eigene Strukturen
      1. Wenn viele Daten wandern wollen
      2. Bürogespräche
      3. Strukturierte Datentypen mit Structs gestalten
      4. Fisch und nichts anderes
      5. Die Felder eines Struct lesen Sie mit dem ».«-Operator
      6. Kann man ein Struct in ein anderes stecken?
      7. Wie aktualisiert man ein Struct?
      8. Der Code klont die Kröte
      9. Sie brauchen einen Zeiger auf das Struct
      10. (*s).alter vs. *s.alter
      11. Manchmal erfordert eine Sache mehrere Datentypen
      12. Mit einer Union können Sie Speicherplatz sparen
      13. Wie man eine Union nutzt?
        1. C89-Stil für das erste Feld
        2. Designierte Initialisierer für die anderen Felder
        3. Den Wert mit der Punktnotation setzen
        4. Unions und Structs werden häufig kombiniert
      14. Eine Enum-Variable speichert ein Symbol
      15. Kontrolle bis zur Bit-Ebene
      16. Bitfelder speichern eine beliebige Anzahl von Bits
      17. Ihr C-Werkzeugkasten
    2. 7. Datenstrukturen und dynamischer Speicher: Brücken bauen
      1. Flexibler Speicher gefällig?
      2. Verkettete Listen sind wie Datenketten
      3. Verkettete Listen gestatten Einfügungen
      4. Eine rekursive Struktur erstellen
      5. Mit C Inseln schaffen ...
        1. ... und sie so verbinden, dass sie eine Tour bilden
      6. Werte in die Liste einsetzen
      7. Dynamische Speicherung auf dem Heap
        1. Beschaffen Sie sich den Speicher mit malloc()
      8. Hinterher den Speicher freigeben
        1. Geben Sie Speicher frei, indem Sie die Funktion free() aufrufen
      9. Mit malloc() Speicher anfordern ...
        1. ... und mit free() freigeben
      10. O nein! Schon wieder die Schauspieler ...
      11. Reparieren wir den Code mit strdup()
        1. Und? Repariert das den Code?
      12. Geben Sie Speicher frei, wenn Sie ihn nicht mehr benötigen
      13. Beweisstück 1: der Quellcode
      14. Das System im Überblick
        1. Das Programm erstellt einen Baum der Verdächtigen
        2. Ziemlich gewieft. Was also ist das Problem?
      15. Softwareforensik: valgrind
        1. Den Code vorbereiten: Debug-Daten einbauen
        2. Nur die Tatsachen: Ihren Code befragen
      16. Wiederholte Beweisaufnahme mit valgrind
        1. Diesmal hat valgrind ein Speicherleck gefunden
      17. Die Beweisstücke
        1. 1. Ort
        2. 2. Hinweise von valgrind
      18. Die Reparatur testen
        1. Das Leck ist gestopft
      19. Ihr C-Werkzeugkasten
    3. 8. Fortgeschrittene Funktionen: Ihre Funktionen auf Vordermann bringen
      1. Auf der Suche nach dem Märchenprinzen ...
      2. Einer Funktion Code übergeben
      3. Sie müssen suchen() den Namen einer Funktion mitteilen
      4. Jeder Funktionsname ist ein Zeiger auf die Funktion ...
      5. ... aber es gibt keinen Funktionsdatentyp
        1. Warum hat C keinen Funktionsdatentyp?
      6. Wie man Funktionszeiger erstellt
      7. Ordnung mit der C-Standardbibliothek
      8. Ordnung schaffen mit Funktionszeigern
      9. Standardbriefe automatisieren
      10. Ein Array von Funktionszeigern erstellen
        1. Aber wie hilft uns das Array?
      11. Funktionen deeehnbar machen
        1. Wie aber macht man so etwas selbst?
      12. Ihr C-Werkzeugkasten
    4. 9. Statische und dynamische Bibliotheken: Code-Wiederverwendung
      1. Code, den Sie auf die Bank bringen können
      2. Spitze Klammern sind für Standard-Header
      3. Aber was ist, wenn Sie Code gemeinsam nutzen wollen?
      4. Header-Dateien gemeinsam nutzen
      5. Objektdateien über den vollständigen Pfadnamen teilen
      6. Ein Archiv enthält .o-Dateien
      7. Mit dem ar-Befehl ein Archiv erstellen ...
        1. ... und es dann in einem Bibliotheksverzeichnis speichern
      8. Schließlich die anderen Programme kompilieren
      9. Fit von Kopf bis Fuß expandiert
      10. Kalorien berechnen
      11. Die Geschichte ist leider etwas komplizierter ...
      12. Programme bestehen aus vielen Teilen ...
        1. ... aber wurden diese einmal gelinkt, können sie nicht mehr geändert werden
      13. Dynamisches Linken erfolgt zur Laufzeit
      14. Kann man ein Archiv zur Laufzeit linken?
        1. Dynamische Bibliotheken sind gedopte Objektdateien
      15. Erst die Objektdateien erstellen
      16. Der Name Ihrer dynamischen Bibliothek ist plattformabhängig
        1. Das Crosstrainer-Programm kompilieren
      17. Ihr C-Werkzeugkasten
  12. II. C-Workshop: OpenCV
    1. 10. Prozesse und Systemaufrufe: Grenzverletzungen
      1. Systemaufrufe sind Ihr heißer Draht zum Betriebssystem
      2. Dann bricht jemand in das System ein ...
      3. Sicherheit ist nicht das einzige Problem
      4. Die exec()-Funktionen bieten Ihnen mehr Kontrolle
        1. exec()-Funktionen ersetzen den aktuellen Prozess
      5. Es gibt diverse exec()-Funktionen
        1. Die Listenfunktionen: execl(), execlp(), execle()
      6. Die Array-Funktionen: execv(), execvp(), execve()
      7. Umgebungsvariablen übergeben
        1. Aber was passiert bei einem Problem?
      8. Die meisten Systemaufrufe scheitern auf gleiche Weise
      9. Nachrichten lesen mit RSS
      10. exec() ist die Ziellinie für Ihr Programm
        1. fork() klont Ihren Prozess
      11. Mit fork() + exec() einen Kindprozess starten
        1. 1. Eine Kopie anlegen
        2. 2. Der Kindprozess ruft exec() auf
      12. Ihr C-Werkzeugkasten
    2. 11. Interprozesskommunikation: Ein nettes Gespräch
      1. Eingabe und Ausgabe umleiten
      2. Ein Blick in einen typischen Prozess
      3. Eine Umleitung ersetzt einfach die Datenströme
        1. Prozesse können sich selbst umleiten
      4. fileno() nennt Ihnen den Dateideskriptor
        1. dup2() dupliziert Datenströme
      5. Manchmal muss man warten ...
        1. Die Funktion waitpid()
      6. Mit dem Kind verbunden bleiben
        1. Story-Links aus rssgossip lesen
      7. Prozesse mit Pipes verbinden
        1. Über eine Pipe verbundene Befehle sind Eltern und Kinder
      8. Fallstudie: Storys in einem Browser öffnen
        1. pipe() öffnet zwei Datenströme
      9. Im Kind
      10. Im Elternprozess
      11. Eine Webseite in einem Browser öffnen
      12. Der Tod eines Prozesses
        1. Das Betriebssystem steuert Programme über Signale
      13. Signale abfangen und eigenen Code ausführen
        1. Eine sigaction ist ein Funktions-Wrapper
        2. Alle Handler erwarten Signalargumente
      14. sigactions werden mit sigaction() registriert
      15. Den Code den Signal-Handler nutzen lassen
      16. Mit kill Signale senden
        1. Signale senden mit raise()
      17. Ihrem Code einen Weckruf senden
        1. ... setzt der Timer ein SIGALRM-Signal ab
      18. Ihr C-Werkzeugkasten
    3. 12. Sockets und Netzwerke: 127.0.0.1 ist ein toller Ort
      1. Der Internet-Knock-Knock-Server
      2. Knock-Knock-Server im Überblick
      3. BLAB: Wie Server mit dem Internet reden
        1. 1. An einen Port binden
        2. 2. Lauschen
        3. 3. Eine Verbindung annehmen
      4. Ein Socket ist kein billiger Datenstrom
      5. Manchmal startet der Server nicht korrekt
      6. Warum Mama gepredigt hat, immer auf die Fehler zu achten
        1. Gebundene Ports sind haftend
      7. Vom Client lesen
      8. Der Server kann immer nur mit jeweils einer Person reden
      9. Sie können einen eigenen Prozess für jeden Client forken
        1. Elternprozess und Kindprozess nutzen unterschiedliche Sockets
      10. Einen Webclient schreiben
      11. Clients an die Macht
        1. Entfernte Ports und IP-Adressen
      12. Ein Socket für eine IP-Adresse erstellen
      13. getaddrinfo() ermittelt Adressen zu Domains
        1. Ein Socket für einen Domainnamen
      14. Ihr C-Werkzeugkasten
    4. 13. Threads: Parallelwelten
      1. Aufgaben verrichtet man nacheinander ... oder auch nicht ...
      2. ... und Prozesse sind nicht immer die Antwort
      3. Einfache Prozesse tun eine Sache nach der anderen
      4. Zusätzliches Personal: Threads
      5. Wie man Threads erstellt?
      6. Threads mit pthread_create erstellen
      7. Der Code ist nicht Thread-sicher
      8. Sie müssen Verkehrszeichen einführen
      9. Einen Mutex als Verkehrszeichen nutzen
      10. Ihr C-Werkzeugkasten
  13. III. C-Workshop: Blasteroids
    1. A. Was übrig bleibt: Die Top Ten der Dinge (die wir nicht behandelt haben)
      1. 1. Operatoren
        1. Inkrement und Dekrement
        2. Der Ternäroperator
        3. Bit-Manipulation
        4. Kommata trennen Ausdrücke
      2. 2. Präprozessordirektiven
        1. Bedingungen
      3. 3. Das Schlüsselwort static
        1. static kann auch Dinge privat machen
      4. 4. Wie groß die Dinge sind
      5. 5. Automatisierte Tests
      6. 6. Mehr zu gcc
        1. Optimierung
        2. Warnungen
      7. 7. Mehr zu make
        1. Variablen
        2. %, ^ und @
        3. Implizite Regeln
      8. 8. Entwicklungswerkzeuge
        1. gdb
        2. gprof
        3. gcov
      9. 9. GUIs erstellen
        1. Linux – GTK
        2. Windows
        3. Mac – Carbon
      10. 10. Referenzmaterial
        1. Websites
    2. B. C-Themen: Zusammenfassungen im Überblick
      1. Grundlagen
      2. Zeiger und Speicher
      3. Strings
      4. Datenströme
      5. Datentypen
      6. Mehrere Dateien
      7. structs
      8. unions und Bitfelder
      9. Datenstrukturen
      10. Dynamischer Speicher
      11. Fortgeschrittene Funktionen
      12. Statische und dynamische Bibliotheken
      13. Prozesse und Kommunikation
      14. Sockets und Netzwerke
      15. Threads
  14. Stichwortverzeichnis
  15. Impressum