Documentation C
Référence C concise et illustrée par des exemples. Lisez le concept, voyez le code, puis pratiquez-le dans un parcours Coddy.
Pour commencer
- Qu'est-ce que le CLe C est un langage compilé, petit et rapide, né en 1972, qui fait encore tourner des systèmes d'exploitation, des bases de données et presque tous les appareils embarqués. Voici ce qu'il est, où il s'exécute, et pourquoi il vaut la peine de l'apprendre en 2026.
- Installer le C (GCC)Installez un compilateur C fonctionnel sur n'importe quel système : MinGW-w64 sous Windows, le clang d'Apple sous macOS et gcc sous Linux - plus comment vérifier que l'installation a réussi et compiler votre premier fichier.
- Compiler et exécuterTransformer un fichier .c en programme qui tourne : la commande gcc, ce que font réellement le préprocesseur, le compilateur et l'éditeur de liens, les options à utiliser dès le premier jour, et comment lire les erreurs quand cela échoue.
- Syntaxe CTout programme C a le même squelette : des inclusions, une fonction main, des instructions terminées par un point-virgule et des blocs entre accolades. Voici ce que fait chaque partie et les règles que le compilateur applique réellement.
- CommentairesLe C a deux styles de commentaires - la ligne unique // et le bloc /* */ - avec des histoires différentes et un piège d'imbrication. Voici comment utiliser les deux, plus ce qui mérite un commentaire et ce qui n'en mérite pas.
Variables et types
- VariablesComment déclarer une variable en C, la différence entre déclaration et initialisation, les règles de nommage, en déclarer plusieurs à la fois, et pourquoi une variable non initialisée est le bug de débutant le plus courant.
- Types de donnéesToute variable C a un type qui fixe sa taille et ce qu'elle peut contenir. Voici tous les types de base, leurs tailles réelles, signé contre non signé, sizeof, limits.h, et ce qui se passe en cas de débordement.
- ConstantesTrois façons de nommer une valeur qui ne change jamais en C - le mot-clé const, les macros #define et les constantes d'énumération - ce que chacune est réellement, et laquelle choisir selon le cas.
- OpérateursTous les opérateurs C qui comptent - arithmétiques, d'affectation, de comparaison, logiques et d'incrémentation - plus le piège de la division entière, le comportement du modulo avec les négatifs, et une table de précédence fiable.
- BooléensLe C n'a eu aucun type booléen jusqu'à C99. Zéro est faux, tout le reste est vrai, les comparaisons produisent un int - et stdbool.h ajoute bool, true et false par-dessus. Plus le bug = contre == que cette conception rend possible.
- TranstypageLe C convertit entre types en permanence - parfois parce que vous l'avez demandé avec un cast, et plus souvent tout seul. Voici les règles de promotion, la syntaxe du cast explicite, et les conversions qui perdent silencieusement des données.
Flux de contrôle
- if / elseComment le C décide : l'instruction if, else, les chaînes else if, l'imbrication et l'opérateur ternaire - plus la règle de véracité (0 est faux, tout le reste est vrai) et le bug `=` contre `==` qui casse silencieusement les conditions.
- switchComment l'instruction switch du C choisit une branche dans une liste de constantes - les étiquettes case, pourquoi break compte, le passage au suivant voulu et accidentel, default, switcher sur des char et des enums, et quand switch bat une chaîne else-if.
- boucle forComment répéter du code avec la boucle for du C - l'en-tête en trois parties, compter vers le haut et vers le bas, parcourir des tableaux avec l'astuce sizeof, les boucles imbriquées, les boucles infinies, et les bugs de décalage d'un et de types non signés qui piègent tout le monde.
- Boucle whileComment la boucle while du C répète jusqu'à ce qu'une condition change - la règle du test en premier, les boucles à sentinelle, la lecture d'entrée jusqu'à EOF, while(1), et la conversion entre for et while.
- Boucle do-whileLa boucle corps-d'abord du C : comment do-while garantit un passage avant le test, pourquoi elle se termine par un point-virgule, les motifs de menu et de nouvelle tentative pour lesquels elle est faite, et en quoi elle diffère d'une simple boucle while.
- break et continuebreak quitte une boucle ou un switch ; continue passe au tour suivant. Comment chacun se comporte dans for, while et do-while, comment sortir de boucles imbriquées avec un drapeau ou goto, et les abus qui rendent les boucles illisibles.
Fonctions
- fonctionsComment définir et appeler des fonctions en C - le type de retour, les paramètres, les valeurs de retour, les fonctions void, pourquoi la décomposition compte, et un exemple complet construit à partir de petits morceaux nommés.
- Paramètres de fonctionLe C passe tout par valeur - les fonctions reçoivent des copies, jamais les originaux. Ce que cela signifie en pratique, comment les pointeurs simulent le passage par référence, pourquoi les tableaux se comportent autrement, et comment renvoyer plusieurs résultats.
- Prototypes de fonctionsPourquoi le C doit voir la forme d'une fonction avant que vous ne l'appeliez - écrire des prototypes, corriger les erreurs de déclaration implicite, placer les prototypes dans des fichiers d'en-tête, et la vraie différence entre f(void) et f().
- récursionComment une fonction C s'appelle elle-même - le cas de base qui l'arrête, factorielle et Fibonacci déroulées, pourquoi le Fibonacci naïf est catastrophiquement lent, ce qu'est réellement un débordement de pile, et quand une boucle est la meilleure réponse.
- portéeOù une variable C est visible et combien de temps elle vit - portée de bloc, paramètres de fonction, globales à portée fichier, variables locales static qui survivent entre les appels, fonctions static, masquage, et pourquoi les globales posent problème.
Pointeurs
- PointeursUn pointeur est une variable qui stocke une adresse mémoire. Cette page construit l'idée depuis la base - les opérateurs & et *, la déclaration et le déréférencement, pourquoi le type d'un pointeur compte, et la fonction swap() qui montre pourquoi les pointeurs existent.
- Arithmétique de pointeursAjouter 1 à un pointeur n'ajoute pas 1 octet - cela déplace vers l'objet suivant de ce type. Cette page couvre ptr+1, l'incrémentation et la décrémentation, la différence de pointeurs, les comparaisons, le parcours d'un tableau par pointeur, et la règle du un-après-la-fin.
- Pointeurs et tableauxEn C, un nom de tableau se transforme en pointeur sur son premier élément presque partout où vous l'utilisez. Cette page explique cette dégradation, pourquoi arr[i] est littéralement *(arr+i), pourquoi la taille du tableau doit voyager séparément vers les fonctions, et en quoi un pointeur sur tableau diffère d'un tableau de pointeurs.
- Pointeurs de fonctionLes fonctions ont aussi des adresses, et un pointeur de fonction en stocke une. Cette page décode la syntaxe de déclaration, montre comment typedef la rend lisible, et construit jusqu'aux callbacks, à qsort avec un comparateur personnalisé et aux tables de dispatch.
- Pointeurs NULLNULL est l'adresse que détient un pointeur quand il ne pointe sur rien. Cette page couvre ce qu'est réellement NULL, pourquoi le déréférencer plante, en quoi il diffère de 0 et d'un pointeur non initialisé, et les motifs défensifs qui tiennent les bugs de nullité hors de votre code.
Tableaux et chaînes
- TableauxComment déclarer et initialiser des tableaux en C, les indexer à partir de zéro, calculer la longueur avec sizeof, parcourir les éléments, et pourquoi lire au-delà de la fin est un comportement indéfini plutôt qu'un message d'erreur.
- Tableaux multidimensionnelsComment déclarer, initialiser et parcourir des tableaux 2D en C, ce que signifie réellement la disposition par lignes en mémoire, pourquoi passer un tableau 2D à une fonction exige le nombre de colonnes, et un exemple matriciel complet.
- ChaînesLe C n'a pas de type chaîne - une chaîne est un tableau de char se terminant par un octet '\0'. Cette page construit ce modèle mental, puis couvre les littéraux, l'affichage, le parcours, et pourquoi on ne peut pas copier une chaîne avec =.
- Fonctions de chaînesUn tour pratique de <string.h> : mesurer avec strlen, copier avec strcpy et strncpy, joindre avec strcat, comparer avec strcmp, chercher avec strchr et strstr - et comment dimensionner les tampons pour qu'aucune ne déborde.
- Conversion de chaînesConvertir entre texte et nombres en C : pourquoi atoi ne peut pas signaler d'erreur, comment utiliser strtol et strtod correctement avec endptr et errno, transformer des nombres en chaînes avec snprintf, et les astuces sur un chiffre avec '0'.
Mémoire dynamique
- Mémoire dynamiquePourquoi le tas existe, comment malloc vous donne de la mémoire dont la taille est décidée à l'exécution, l'idiome p = malloc(n * sizeof *p), la vérification de NULL, la libération exactement une fois, et un tableau dynamique déroulé de bout en bout.
- calloc et realloccalloc vous donne de la mémoire mise à zéro et multiplie la taille sans risque ; realloc agrandit un bloc que vous avez déjà rempli. Cette page couvre les deux, l'idiome du pointeur temporaire qui évite la fuite d'un realloc échoué, et les cas où calloc bat malloc plus memset.
- Fuites de mémoireCe qu'est réellement une fuite, les trois façons dont les programmes C en produisent, la discipline de propriété qui les prévient, et comment trouver le reste avec valgrind et -fsanitize=address - le tout se terminant par un programme qui fuit, corrigé étape par étape.
- Pile et tasOù vivent réellement vos données : stockage automatique sur la pile, stockage dynamique sur le tas, et stockage statique comme troisième région - avec le classique bug du pointeur pendouillant issu du renvoi d'une locale, et une règle pour choisir.
Structs, unions et enums
- structuresComment regrouper des valeurs liées en un seul type avec une structure C - la déclarer, accéder aux membres avec l'opérateur point, les initialiseurs désignés, les tableaux de structures, l'imbrication, et la règle de copie au passage qui surprend tout le monde.
- Structures et pointeursComment pointer sur une structure en C - l'opérateur flèche, pourquoi (*p).x a besoin de ses parenthèses, passer des structures par pointeur pour les modifier ou éviter les copies, allouer une structure avec malloc, et construire un nœud de liste chaînée.
- typedefComment typedef donne un nouveau nom à un type C existant - l'idiome typedef struct avec et sans étiquette, les typedef pour pointeurs de fonction et tableaux, et le seul cas où un typedef nuit : cacher un pointeur.
- unionsComment une union C stocke plusieurs types dans les mêmes octets - pourquoi sa taille est celle du plus grand membre, pourquoi il faut lire le membre écrit en dernier, et comment une union étiquetée (enum plus union) la rend sûre.
- enumsComment définir une énumération en C - numérotation automatique, valeurs explicites, usage dans un switch pour que le compilateur détecte les cas manquants, conversion d'une enum en chaîne, et les conventions de nommage qui les gardent lisibles.
Entrée et sortie
- printfComment printf fonctionne réellement en C - le modèle de la chaîne de format, les spécificateurs du quotidien, largeur et précision pour une sortie alignée, l'affichage sensé des flottants, la valeur de retour, et pourquoi printf(saisie_utilisateur) est un trou de sécurité.
- scanfComment lire l'entrée avec scanf en C - pourquoi le & est obligatoire, comment les espaces sont traités, le débordement de tampon de %s et sa correction par largeur, la vérification de la valeur de retour, le bug du saut de ligne résiduel, et fgets comme alternative robuste.
- Spécificateurs de formatTous les spécificateurs de format du C au même endroit - ce que signifient %d, %s, %c, %f, %p et les autres, les modificateurs de longueur l, ll, h et z, largeur, précision et drapeaux, et ceux qui diffèrent entre printf et scanf.
- fichiersComment lire et écrire des fichiers en C - le tableau des modes de fopen, la vérification de NULL, l'écriture avec fprintf et fputc, la lecture avec fgets, fscanf et fgetc, la boucle canonique ligne par ligne, et quand utiliser le mode binaire.
- Arguments de ligne de commandeComment un programme C lit sa ligne de commande - l'anatomie de argc et argv, le parcours des arguments, ce que contient argv[0], la conversion de nombres avec strtol plutôt qu'atoi, et une petite calculatrice qui réunit le tout.
Le préprocesseur
- préprocesseurLe préprocesseur modifie le texte de votre source avant que le compilateur ne le voie - collage d'en-têtes, substitution de macros, activation ou désactivation de code. Voici toute la famille des directives et comment regarder sa sortie.
- macrosMacros objets et macros à la fonction avec #define - pourquoi chaque argument et le corps entier ont besoin de parenthèses, le piège de l'évaluation multiple, les macros multilignes avec do-while(0), et quand une fonction ou un const est le meilleur outil.
- Fichiers d'en-têteComment répartir un programme C sur plusieurs fichiers : ce qui va dans un .h, ce qui va dans un .c, les gardes d'inclusion qui stoppent la double inclusion, la compilation de plusieurs fichiers ensemble, et le partage de variables globales avec extern.
- Compilation conditionnelleCompilez du code différent selon la version avec #ifdef, #ifndef, #if, #elif et #else - interrupteurs de débogage, branches par plateforme, définition de macros en ligne de commande avec -D, et usage de #if 0 pour désactiver du code.
Bibliothèque standard
- Fonctions mathématiquesUn tour de math.h - sqrt, pow, fabs, floor et ceil, round, fmod, les familles trigonométriques et logarithmiques, INFINITY et NAN - plus l'option -lm qui cause la classique erreur undefined reference.
- Nombres aléatoiresComment générer des nombres aléatoires en C avec rand() et RAND_MAX, pourquoi on initialise avec srand(time(NULL)) exactement une fois, la mise dans un intervalle avec % et le petit biais que cela introduit, les doubles aléatoires, et les séquences reproductibles.
- Bibliothèque standardCe que chaque en-tête standard vous donne - stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h et assert.h - avec un court exemple fonctionnel de chacun.
Erreurs et débogage
- Erreur de segmentationUn segfault signifie que votre programme a touché de la mémoire qui ne lui appartient pas. Voici les cinq causes qui expliquent presque toutes, chacune avec un exemple minimal et sa correction, plus comment trouver la ligne exacte avec gdb et AddressSanitizer.
- Erreurs courantesLes erreurs que tout programmeur C commet au moins une fois - point-virgule manquant, = au lieu de ==, déclarations implicites, scanf sans &, comparaison de chaînes avec ==, division entière, variables non initialisées et décalage d'un - chacune avec son symptôme, sa cause et sa correction.
- Comportement indéfiniLe comportement indéfini, c'est du code sur lequel la norme C n'impose aucune exigence - donc n'importe quoi peut arriver, y compris l'optimiseur supprimant vos vérifications. Voici ce qui le provoque, pourquoi « ça marche sur ma machine » ne prouve rien, et les options qui l'attrapent.