C-Dokumentation
Kompakte, beispielorientierte C-Referenz. Konzept lesen, Code ansehen, dann in einem Coddy-Lernweg üben.
Erste Schritte
- Was ist CC ist eine kleine, schnelle, kompilierte Sprache von 1972, die noch immer Betriebssysteme, Datenbanken und nahezu jedes eingebettete Gerät antreibt. Hier steht, was sie ist, wo sie läuft und warum sie sich 2026 noch zu lernen lohnt.
- C installieren (GCC)Einen funktionierenden C-Compiler auf jedem System installieren: MinGW-w64 unter Windows, Apples clang unter macOS und gcc unter Linux - dazu, wie man prüft, ob die Installation geklappt hat, und die erste Datei kompiliert.
- Kompilieren und AusführenAus einer .c-Datei ein laufendes Programm machen: der gcc-Befehl, was Präprozessor, Compiler und Linker tatsächlich tun, die Flags, die sich vom ersten Tag an lohnen, und wie man die Fehler liest, wenn es schiefgeht.
- C-SyntaxJedes C-Programm hat dasselbe Grundgerüst: Includes, eine main-Funktion, Anweisungen mit Semikolon und Blöcke in geschweiften Klammern. Hier steht, was jeder Teil tut und welche Regeln der Compiler tatsächlich durchsetzt.
- KommentareC hat zwei Kommentarstile - einzeilig mit // und mehrzeilig mit /* */ - mit unterschiedlicher Geschichte und einer Verschachtelungsfalle. Hier steht, wie man beide benutzt und was kommentierenswert ist und was nicht.
Variablen & Typen
- VariablenWie man in C eine Variable deklariert, der Unterschied zwischen Deklaration und Initialisierung, Namensregeln, mehrere auf einmal deklarieren, und warum eine uninitialisierte Variable der häufigste Anfängerfehler ist.
- DatentypenJede C-Variable hat einen Typ, der ihre Größe und ihren möglichen Inhalt festlegt. Hier sind alle Grundtypen, ihre tatsächlichen Größen, vorzeichenbehaftet gegen vorzeichenlos, sizeof, limits.h und was bei einem Überlauf passiert.
- KonstantenDrei Wege, einem unveränderlichen Wert in C einen Namen zu geben - das Schlüsselwort const, #define-Makros und enum-Konstanten - was jeder davon wirklich ist und wozu man wann greift.
- OperatorenJeder wissenswerte C-Operator - Arithmetik, Zuweisung, Vergleich, Logik und Inkrement - dazu die Falle der Ganzzahldivision, wie sich Modulo bei negativen Zahlen verhält, und eine Vorrangtabelle, der du trauen kannst.
- BooleansC hatte bis C99 keinen Wahrheitstyp. Null ist falsch, alles andere ist wahr, Vergleiche liefern int - und stdbool.h gibt dir obendrauf bool, true und false. Dazu der = statt ==-Bug, den dieses Design ermöglicht.
- TypumwandlungC wandelt ständig zwischen Typen um - manchmal, weil du mit einem Cast danach gefragt hast, und öfter von allein. Hier sind die Beförderungsregeln, die explizite Cast-Syntax und die Umwandlungen, die still Daten verlieren.
Kontrollfluss
- if / elseWie C entscheidet: die if-Anweisung, else, else-if-Ketten, Verschachtelung und der ternäre Operator - dazu die Wahrheitsregel (0 ist falsch, alles andere wahr) und der `=` statt `==`-Bug, der Bedingungen still zerstört.
- switchWie die C-switch-Anweisung einen Zweig aus einer Liste von Konstanten wählt - case-Label, warum break zählt, absichtliches und versehentliches Durchfallen, default, switch über chars und enums, und wann switch eine else-if-Kette schlägt.
- for-SchleifeWie man Code mit der C-for-Schleife wiederholt - der dreiteilige Kopf, hoch- und runterzählen, Arrays mit dem sizeof-Trick durchlaufen, verschachtelte Schleifen, Endlosschleifen sowie die Off-by-one- und Unsigned-Bugs, die jeden erwischen.
- while-SchleifeWie die C-while-Schleife wiederholt, bis sich eine Bedingung ändert - die Bedingung-zuerst-Regel, Wächterschleifen, Eingaben bis zum Dateiende lesen, while(1), und die Umwandlung zwischen for und while.
- do-while-SchleifeCs Schleife mit dem Rumpf zuerst: wie do-while einen Durchlauf vor der Prüfung garantiert, warum sie mit einem Semikolon endet, die Menü- und Wiederholungsmuster, für die sie gemacht ist, und worin sie sich von einer schlichten while-Schleife unterscheidet.
- break und continuebreak verlässt eine Schleife oder ein switch; continue springt zum nächsten Durchlauf. Wie sich beide in for, while und do-while verhalten, wie man mit einem Flag oder goto aus verschachtelten Schleifen kommt, und die Fehlgriffe, die Schleifen unlesbar machen.
Funktionen
- FunktionenWie man in C Funktionen definiert und aufruft - der Rückgabetyp, Parameter, Rückgabewerte, void-Funktionen, warum Zerlegung wichtig ist, und ein vollständiges Beispiel aus kleinen benannten Teilen.
- FunktionsparameterC übergibt alles als Wert - Funktionen bekommen Kopien, nie Originale. Was das in der Praxis bedeutet, wie Zeiger eine Referenzübergabe nachbilden, warum sich Arrays anders verhalten, und wie man mehrere Ergebnisse zurückgibt.
- FunktionsprototypenWarum C die Gestalt einer Funktion sehen muss, bevor du sie aufrufst - Prototypen schreiben, Fehler wegen impliziter Deklaration beheben, Prototypen in Header-Dateien legen, und der echte Unterschied zwischen f(void) und f().
- RekursionWie eine C-Funktion sich selbst aufruft - der Basisfall, der sie stoppt, Fakultät und Fibonacci durchgearbeitet, warum naives Fibonacci katastrophal langsam ist, was ein Stacküberlauf wirklich ist, und wann eine Schleife die bessere Antwort ist.
- GültigkeitsbereichWo eine C-Variable sichtbar ist und wie lange sie lebt - Blockgültigkeit, Funktionsparameter, globale Variablen auf Dateiebene, static-Lokale, die zwischen Aufrufen überleben, static-Funktionen, Verdecken, und warum globale Variablen Ärger machen.
Zeiger
- ZeigerEin Zeiger ist eine Variable, die eine Speicheradresse speichert. Diese Seite baut die Idee von Grund auf - die Operatoren & und *, Zeiger deklarieren und dereferenzieren, warum Zeigertypen zählen, und die swap()-Funktion, die zeigt, warum es Zeiger überhaupt gibt.
- Zeigerarithmetik1 zu einem Zeiger zu addieren addiert kein Byte - es rückt zum nächsten Objekt dieses Typs. Diese Seite behandelt ptr+1, Inkrement und Dekrement, Zeigerdifferenzen, Vergleiche, das Durchlaufen eines Arrays mit einem Zeiger und die Eins-hinter-dem-Ende-Regel.
- Zeiger und ArraysIn C wird ein Arrayname fast überall, wo du ihn benutzt, zu einem Zeiger auf sein erstes Element. Diese Seite erklärt diesen Zerfall, warum arr[i] buchstäblich *(arr+i) ist, warum die Arraygröße getrennt in Funktionen reisen muss und wie sich ein Zeiger auf ein Array von einem Array von Zeigern unterscheidet.
- FunktionszeigerAuch Funktionen haben Adressen, und ein Funktionszeiger speichert eine davon. Diese Seite entschlüsselt die Deklarationssyntax, zeigt, wie typedef sie lesbar macht, und arbeitet sich zu Callbacks, qsort mit eigenem Vergleicher und Sprungtabellen vor.
- NULL-ZeigerNULL ist die Adresse, die ein Zeiger hält, wenn er auf nichts zeigt. Diese Seite behandelt, was NULL wirklich ist, warum das Dereferenzieren abstürzt, wie es sich von 0 und von einem uninitialisierten Zeiger unterscheidet, und die Schutzmuster, die Null-Bugs aus deinem Code halten.
Arrays & Strings
- ArraysWie man Arrays in C deklariert und initialisiert, sie ab null indiziert, die Länge mit sizeof berechnet, über die Elemente iteriert - und warum das Lesen hinter dem Ende undefiniertes Verhalten ist statt einer Fehlermeldung.
- Mehrdimensionale ArraysWie man 2D-Arrays in C deklariert, initialisiert und durchläuft, was zeilenweise Anordnung im Speicher wirklich bedeutet, warum das Übergeben eines 2D-Arrays an eine Funktion die Spaltenzahl verlangt, und ein durchgearbeitetes Matrixbeispiel.
- ZeichenkettenC hat keinen Zeichenkettentyp - eine Zeichenkette ist ein char-Array, das mit einem '\0'-Byte endet. Diese Seite baut dieses Denkmodell auf und behandelt dann Literale, Ausgabe, Durchlaufen und warum man eine Zeichenkette nicht mit = kopieren kann.
- ZeichenkettenfunktionenEine praktische Tour durch <string.h>: messen mit strlen, kopieren mit strcpy und strncpy, verbinden mit strcat, vergleichen mit strcmp, suchen mit strchr und strstr - und wie man Puffer so bemisst, dass keine davon überläuft.
- ZeichenkettenumwandlungZwischen Text und Zahlen umwandeln in C: warum atoi keinen Fehler melden kann, wie man strtol und strtod mit endptr und errno richtig benutzt, Zahlen mit snprintf in Zeichenketten verwandelt, und Tricks mit einzelnen Ziffern und '0'.
Dynamischer Speicher
- Dynamischer SpeicherWarum es den Heap gibt, wie malloc dir Speicher gibt, dessen Größe zur Laufzeit feststeht, das Idiom p = malloc(n * sizeof *p), die Prüfung auf NULL, genau einmal freigeben, und ein dynamisches Array von Anfang bis Ende.
- calloc und realloccalloc liefert genullten Speicher und multipliziert die Größe sicher; realloc vergrößert einen Block, den du bereits gefüllt hast. Diese Seite behandelt beide, das Temporärzeiger-Idiom, das ein fehlgeschlagenes realloc am Lecken hindert, und wann calloc besser ist als malloc plus memset.
- SpeicherlecksWas ein Leck wirklich ist, die drei Arten, wie C-Programme welche erzeugen, die Besitzdisziplin, die sie verhindert, und wie man den Rest mit valgrind und -fsanitize=address findet - abschließend ein leckendes Programm, Schritt für Schritt repariert.
- Stack gegen HeapWo deine Daten tatsächlich leben: automatischer Speicher auf dem Stack, dynamischer Speicher auf dem Heap und statischer Speicher als dritter Bereich - mit dem klassischen Bug des baumelnden Zeigers beim Zurückgeben einer Lokalen und einer Regel zur Wahl.
Structs, Unions & Enums
- StrukturenWie man zusammengehörige Werte mit einer C-Struktur zu einem Typ bündelt - deklarieren, Elemente mit dem Punktoperator ansprechen, benannte Initialisierer, Arrays von Strukturen, Verschachtelung und die Kopierregel beim Übergeben, die jeden überrascht.
- Strukturen-und-ZeigerWie man in C auf eine Struktur zeigt - der Pfeiloperator, warum (*p).x seine Klammern braucht, Strukturen per Zeiger übergeben, um sie zu ändern oder Kopien zu vermeiden, eine Struktur mit malloc belegen und einen Knoten einer verketteten Liste bauen.
- typedefWie typedef einem vorhandenen C-Typ einen neuen Namen gibt - das typedef-struct-Idiom mit und ohne Tag, typedefs für Funktionszeiger und Arrays, und der eine Fall, in dem ein typedef schadet: einen Zeiger zu verstecken.
- UnionsWie eine C-Union mehrere Typen in denselben Bytes speichert - warum ihre Größe die des größten Elements ist, warum du das Element lesen musst, das du zuletzt geschrieben hast, und wie eine markierte Union (enum plus union) das sicher macht.
- EnumsWie man in C ein enum definiert - automatische Nummerierung, explizite Werte, Enums in einem switch, damit der Compiler fehlende Fälle findet, ein Enum in eine Zeichenkette umwandeln, und die Namenskonventionen, die sie lesbar halten.
Ein- & Ausgabe
- printfWie printf in C tatsächlich funktioniert - das Modell der Formatzeichenkette, die Angaben, die du täglich benutzt, Breite und Genauigkeit für ausgerichtete Ausgabe, Gleitkommazahlen vernünftig ausgeben, der Rückgabewert, und warum printf(user_input) ein Sicherheitsloch ist.
- scanfWie man mit scanf in C Eingaben liest - warum das & Pflicht ist, wie Leerraum behandelt wird, der %s-Pufferüberlauf und seine Breitenlösung, den Rückgabewert prüfen, der Zeilenumbruch-Restbug, und fgets als robuste Alternative.
- FormatangabenJede C-Formatangabe an einem Ort - was %d, %s, %c, %f, %p und der Rest bedeuten, die Längenmodifikatoren l, ll, h und z, Breite, Genauigkeit und Flags, und welche sich zwischen printf und scanf unterscheiden.
- DateiverarbeitungWie man in C Dateien liest und schreibt - die fopen-Modustabelle, die Prüfung auf NULL, Schreiben mit fprintf und fputc, Lesen mit fgets, fscanf und fgetc, die kanonische Zeile-für-Zeile-Schleife und wann man den Binärmodus nimmt.
- KommandozeilenargumenteWie ein C-Programm seine Kommandozeile liest - der Aufbau von argc und argv, das Durchlaufen der Argumente, was in argv[0] steht, Zahlen mit strtol statt atoi umwandeln, und ein kleiner Rechner, der alles zusammenbringt.
Der Präprozessor
- PräprozessorDer Präprozessor bearbeitet deinen Quelltext, bevor der Compiler ihn je sieht - er fügt Header ein, ersetzt Makros und schaltet Code an oder aus. Hier ist die ganze Familie der Direktiven und wie man sich ihre Ausgabe ansieht.
- MakrosObjektartige und funktionsartige Makros mit #define - warum jedes Argument und der ganze Rumpf Klammern brauchen, die Mehrfachauswertungsfalle, mehrzeilige Makros mit do-while(0), und wann eine Funktion oder ein const das bessere Werkzeug ist.
- Header-DateienWie man ein C-Programm auf Dateien aufteilt: was in eine .h gehört, was in eine .c, Include-Schutz gegen doppeltes Einbinden, mehrere Dateien zusammen kompilieren und globale Variablen mit extern teilen.
- bedingte-übersetzungMit #ifdef, #ifndef, #if, #elif und #else unterschiedlichen Code für unterschiedliche Builds übersetzen - Debug-Schalter, Plattformzweige, Makros per -D auf der Kommandozeile definieren und Code mit #if 0 abschalten.
Standardbibliothek
- MathematikfunktionenEine Tour durch math.h - sqrt, pow, fabs, floor und ceil, round, fmod, die Trigonometrie- und Logarithmusfamilien, INFINITY und NAN - dazu das Linker-Flag -lm, das den klassischen undefined-reference-Fehler verursacht.
- ZufallszahlenWie man in C mit rand() und RAND_MAX Zufallszahlen erzeugt, warum man genau einmal mit srand(time(NULL)) initialisiert, das Abbilden in einen Bereich mit % und die kleine Verzerrung dabei, zufällige Gleitkommazahlen und reproduzierbare Folgen.
- StandardbibliothekWas jeder Standardheader dir gibt - stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h und assert.h - mit je einem kurzen, lauffähigen Beispiel.
Fehler & Debugging
- SegmentierungsfehlerEin Segfault bedeutet, dass dein Programm Speicher angefasst hat, der ihm nicht gehört. Hier sind die fünf Ursachen, die fast alle erklären, jede mit einem minimalen Beispiel und ihrer Lösung, dazu, wie man die genaue Zeile mit gdb und AddressSanitizer findet.
- häufige-fehlerDie Fehler, die jeder C-Programmierer mindestens einmal macht - fehlende Semikolons, = statt ==, implizite Deklarationen, scanf ohne &, Zeichenketten mit == vergleichen, Ganzzahldivision, uninitialisierte Variablen und Off-by-one - jeweils als Symptom, Ursache und Lösung.
- undefiniertes-VerhaltenUndefiniertes Verhalten ist Code, an den der C-Standard keine Anforderungen stellt - es kann also alles passieren, einschließlich dessen, dass der Optimierer deine Prüfungen löscht. Hier steht, was es verursacht, warum „bei mir läuft es" nichts beweist, und welche Flags es abfangen.