Einführung in die Programmiersprache C

Einleitung

Dieses Seminar bietet einen strukturierten und praxisnahen Einstieg in die prozedurale Programmiersprache C. Teilnehmer erlernen die Syntax, den Umgang mit grundlegenden Datenstrukturen sowie die hardwarenahe Programmierung durch Zeiger (Pointer) und manuelle Speicherverwaltung. Ziel ist der Aufbau eines soliden Fundaments für die Entwicklung von performanter Systemsoftware, Treibern oder eingebetteten Systemen (Embedded Systems).

Zielgruppe / Voraussetzung

  • Zielgruppe: Angehende Softwareentwickler, Systemprogrammierer, Ingenieure und Umsteiger aus höheren Programmiersprachen.
  • Voraussetzung: Allgemeines technisches Verständnis. IT-Grundkenntnisse sind erforderlich, erste Programmiererfahrungen sind hilfreich, aber nicht zwingend.

Detaillierte Inhalte

Grundlagen und Entwicklungsumgebung

  • Historie und Einsatzgebiete von C (Systemprogrammierung, Embedded C)
  • Der Build-Prozess im Detail: Präprozessor, Compiler, Assembler und Linker (z. B. GCC, Clang)
  • Aufbau eines C-Programms: Die main()-Funktion und grundlegende Syntax
  • Standard-Ein-/Ausgabe: Arbeiten mit printf() und scanf()

Variablen, Datentypen und Operatoren

  • Primitive Datentypen (int, char, float, double) und ihre Speichergrößen
  • Typ-Modifizierer: signed, unsigned, short, long
  • Konstanten definieren (const und #define)
  • Operatoren: Arithmetische, relationale, logische und bitweise Operatoren
  • Implizite und explizite Typumwandlung (Type Casting)

Kontrollstrukturen und Ablaufsteuerung

  • Bedingte Anweisungen: if, else if, else
  • Mehrfachverzweigungen: Das switch-Statement
  • Schleifenkonstrukte: while, do-while und for
  • Schleifensteuerung mit break und continue

Funktionen und Programmstrukturierung

  • Definition, Deklaration und Funktionsprototypen
  • Parameterübergabe: Call-by-Value
  • Rückgabewerte und der Datentyp void
  • Gültigkeitsbereiche von Variablen (Scope): Lokal vs. Global
  • Speicherklassen-Spezifizierer: auto, register, static, extern

Arrays und Zeichenketten (Strings)

  • Deklaration und Initialisierung eindimensionaler Arrays
  • Mehrdimensionale Arrays und Matrizen
  • Spezifika von C-Strings: Nullterminierte Zeichenketten (\0)
  • Wichtige Funktionen der Standardbibliothek <string.h> (strlen, strcpy, strcmp, strcat)

Zeiger (Pointer)

  • Konzept des Arbeitsspeichers und Speicheradressen
  • Zeiger-Deklaration (*) und Adressoperator (&)
  • Dereferenzierung von Zeigern
  • Pointer-Arithmetik und der Zusammenhang zwischen Arrays und Pointern
  • Parameterübergabe an Funktionen: Call-by-Reference (Zeiger als Argumente)

Dynamische Speicherverwaltung

  • Speichermodell: Stack vs. Heap
  • Speicherallokation zur Laufzeit: malloc(), calloc() und realloc()
  • Speicherfreigabe mit free()
  • Best Practices und Fehlervermeidung: Memory Leaks, Dangling Pointers und Buffer Overflows

Strukturierte Datentypen

  • Gruppierung heterogener Daten mit Strukturen (struct)
  • Typdefinitionen mit typedef zur Code-Vereinfachung
  • Unions: Speichereffiziente Datennutzung (union)
  • Aufzählungen (enum) für Konstanten-Gruppen
  • Zeiger auf Strukturen und der Pfeil-Operator (->)

Der C-Präprozessor und Makros

  • Einbinden von Header-Dateien (#include)
  • Definition von Makros mit und ohne Parameter (#define)
  • Bedingte Kompilierung (#ifdef, #ifndef, #endif) zur Portabilität
  • Include-Guards zur Vermeidung von Mehrfacheinbindungen

Datei-Ein- und Ausgabe (File I/O)

  • Dateizeiger (FILE *)
  • Dateien öffnen und schließen (fopen, fclose)
  • Textdateien verarbeiten: fprintf(), fscanf(), fgets(), fputs()
  • Binärdateien verarbeiten: fread() und fwrite()
  • Fehlerbehandlung und Dateiende-Prüfung (feof, ferror)