del 2009_C 12/05/09 9:51 Page 1
ouvrages vendus ouvrages vendus 250 000 250 000
Claude Delannoy Ingénieur informaticien au CNRS, Claude Delannoy possède une grande pratique de la formation continue et de l'enseignement supérieur. Réputés pour la qualité de leur démarche pédagogique, ses ouvrages sur les langages et la programmation totalisent plus de 250 000 exemplaires vendus.
Cet ouvrage est destiné aux étudiants débutants en langage C, mais ayant déjà quelques notions de programmation acquises par la pratique – même sommaire – d'un autre langage.
Les notions fondamentales (types de données, opérateurs, instructions de contrôle, fonctions, tableaux…) sont exposées avec un grand soin pédagogique, le lecteur étant conduit progressivement vers la maîtrise de concepts plus avancés comme les pointeurs ou la gestion dynamique de la mémoire.
Chaque notion importante est illustrée d’exemples de programmes complets, accompagnés de résultats d’exécution. De nombreux exercices, dont la solution est fournie en fin d’ouvrage, vous permettront de tester vos connaissances fraîchement acquises et de les approfondir.
Cette cinquième édition inclut les nouveautés de la dernière version de la norme ISO du langage (C99).
À qui s’adresse ce livre ?
• Aux étudiants de BTS, d’IUT, de licence ou d’écoles d’ingénieur. • Aux autodidactes ou professionnels de tous horizons souhaitant s’initier à la programmation en C. • Aux enseignants et formateurs à la recherche d’une méthode pédagogique et d’un support de cours structuré pour
C e g a g n a l n e r e m m a r g o r P
enseigner le C à des débutants.
Au sommaire
Introduction au langage C • Les types de base du C • Les opérateurs et les expressions • Les entrées-sorties : printf, scanf • Les instructions de contrôle : if, switch, do…while, while, for… • La programmation modulaire et les fonctions • Variables locales et variables globales • Les tableaux et les pointeurs • Les chaînes de caractères • Les structures • Les fichiers • Gestion dynamique de la mémoire : fonctions malloc, free, calloc, realloc • Le préprocesseur • Les possibilités du langage proches de la machine : opérateurs de manipulation de bits, champs de bits, unions • Les principales fonctions de la bibliothèque standard (stdio.h, ctype.h, math.h, stdlib.h) • Corrigé des exercices.
7 - 6 4 5 2 1 - 2 1 2 - 2 - 8 7 9
:
N B S I
•
6 4 5 2 1 G
:
r u e t i d é
e d o C
19,90 €
7 6 4 5 2 1
2 1 2 2 8 7
9
y o n n a e D
l
. C
Claude Delannoy
5e 5e
édition édition
Programmer Programmer en en
langageC langageCCours et exercices corrigés
Cours et exercices corrigés
���������������
���������� ��
��������
���������������������������
AUX EDITIONS EYROLLES
Du même auteur
C. Delannoy. – Exercices en langage C. N°11105, 1997, 260 pages.
C. Delannoy. – Langage C. N°12445, 2e édition, 2008, 936 pages.
C. Delannoy. – C++ pour les programmeurs C. N°12231, 2007, 620 pages.
C. Delannoy. – Apprendre le C++. N°12135, 2007, 760 pages.
C. Delannoy. – Exercices en langage C++. N°12201, 3e édition 2007, 336 pages.
C. Delannoy. – Programmer en Java. Java 5 et 6. N°12232, 5e édition, 2007, 800 pages + CD-Rom.
C. Delannoy. – Exercices en Java. N°11989, 2e édition, 2006, 340 pages.
Autres ouvrages
C. Blaess. – Programmation système en C sous Linux. N°11601, 2e édition 2005, 964 pages.
P. Roques. – UML 2 par la pratique. N°12322, 6e édition, 2008, 368 pages.
T. ZiaDé. – Programmation Python. N°12483, 2e édition, 2009, 586 pages.
J. engels. – PHP 5 : cours et exercices. N°12486, 2e édition, 2009, 638 pages.
E. DasPeT et C. PieRRe de geyeR. – PHP 5 avancé. N°12369, 5e édition, 2008, 844 pages.
C. PoRTeneuve. – Bien développer pour le Web 2.0. Bonnes pratiques Ajax - Prototype, Script.aculo.us, accessibilité, JavaScript, DOM, XHTML/CSS. N°12391, 2e édition, 2008, 674 pages.
C. souTou, o. TesTe. – SQL pour Oracle. N°12299, 3e édition 2008, 554 pages.
C. souTou. – Apprendre SQL avec MySQL. N°11915, 2006, 418 pages.
A. BRillanT. – XML : cours et exercices. N°12151, 2007, 282 pages.
���������������
Publicité
���������� ��
��������
���������������������������
5e édition 2009
10e tirage 2004
ÉDITIONS EYROLLES 61, bd Saint-Germain 75240 Paris Cedex 05 www.editions-eyrolles.com
Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressément la photocopie à usage collectif sans autorisation des ayants droit. Or, cette pratique s’est généralisée notamment dans les établissements d’enseignement, provoquant une baisse brutale des achats de livres, au point que la possibilité même pour les auteurs de créer des œuvres nouvelles et de les faire éditer correctement est aujourd’hui menacée. En application de la loi du 11 mars 1957, il est interdit de reproduire intégralement ou partiellement le présent ouvrage, sur quelque support que ce soit, sans autorisation de l’éditeur ou du Centre Français d’Exploitation du Droit de Copie, 20, rue des Grands-Augustins, 75006 Paris. © Groupe Eyrolles, 1992-2009, ISBN : 978-2-212-12546-7
Delannoy Livre.book Page V Mercredi, 6. mai 2009 4:25 16
Table des matières
Table des matières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2
if
Généralités sur le langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Présentation par l’exemple de quelques instructions du langage C . . . . . . . . . . 1 1.1 Un exemple de programme en langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Structure d’un programme en langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Déclarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . printf 1.4 Pour écrire des informations : la fonction . . . . . . . . . . . . . . . . . . . . . . . . for 1.5 Pour faire une répétition : l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 Pour lire des informations : la fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 Pour faire des choix : l’instruction 1.8 Les directives à destination du préprocesseur . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9 Un second exemple de programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quelques règles d’écriture 2.1 Les identificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Les mots-clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Les séparateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 Le format libre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Création d’un programme en langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 L’édition du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 La compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 L’édition de liens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Les fichiers en-tête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
3
Les types de base du langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 La notion de type Les types entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.1 Leur représentation en mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Les différents types d’entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Notation des constantes entières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les types flottants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Les différents types et leur représentation en mémoire . . . . . . . . . . . . . . . . . . . 3.2 Notation des constantes flottantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
© Éditions Eyrolles
V
1
3 3 3 5 5 6 7 7 8 9 10 12 12 12 13 13 14 15 15 15 16 16
17 17 19 19 19 19 20 20 20
V
Delannoy Livre.book Page VI Mercredi, 6. mai 2009 4:25 16
Programmer en langage C
Table des matières
4
5 6
Les types caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 La notion de caractère en langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Notation des constantes caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Initialisation et constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Autres types introduits par la norme C99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21 21 22 23 24
3
4
3
4 5 6
char
Les opérateurs et les expressions en langage C . . . . . . . . . . . . . . . . . . . . . . . . 25 25 1 27 2 27 27 29 29 29 30 31 33 35 37 38 38 38 39 39 40 41 41 42 43 44 45 47 48 49
. . . . . . . . . . L’originalité des notions d’opérateur et d’expression en langage C Les opérateurs arithmétiques en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Présentation des opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Les priorités relatives des opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les conversions implicites pouvant intervenir dans un calcul d’expression . . 3.1 Notion d’expression mixte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Les conversions d’ajustement de type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Les promotions numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Le cas du type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les opérateurs relationnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les opérateurs logiques L’opérateur d’affectation ordinaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 Notion de lvalue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 L’opérateur d’affectation possède une associativité de droite à gauche . . . . . . . 6.3 L’affectation peut entraîner une conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les opérateurs d’incrémentation et de décrémentation 7.1 Leur rôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Leurs priorités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Leur intérêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les opérateurs d’affectation élargie . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les conversions forcées par une affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 9 10 L’opérateur de cast 11 L’opérateur conditionnel 12 L’opérateur séquentiel 13 L’opérateur 14 Récapitulatif des priorités de tous les opérateurs Exercices
sizeof
7
printf
Les entrées-sorties conversationnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 52 1 52 52 53 54 55 56
Les possibilités de la fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Les principaux codes de conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Action sur le gabarit d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Actions sur la précision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 La syntaxe de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 En cas d’erreur de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 La macro
putchar
printf
VI
© Éditions Eyrolles
Delannoy Livre.book Page VII Mercredi, 6. mai 2009 4:25 16
Table des matières
2
Programmer en langage C
scanf
scanf
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les possibilités de la fonction . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Les principaux codes de conversion de 2.2 Premières notions de tampon et de séparateurs . . . . . . . . . . . . . . . . . . . . . . . . scanf 2.3 Les premières règles utilisées par . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 Imposition d’un gabarit maximal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Rôle d’un espace dans le format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Cas où un caractère invalide apparaît dans une donnée . . . . . . . . . . . . . . . . . . scanf 2.7 Arrêt prématuré de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . scanf 2.8 La syntaxe de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.9 Problèmes de synchronisation entre l’écran et le clavier . . . . . . . . . . . . . . . . . . 2.10 En cas d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.11 La macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
getchar
56 57 57 57 58 59 59 60 61 61 62 64 65
Publicité
Exercices
5
6
2
3
if
if
if
switch
switch
do… while
Les instructions de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 68 1 68 69 69 70 72 72 76 77 78 79 80 80 81 81 82 82 84 86 86 87 88 90
L’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Blocs d’instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Syntaxe de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Imbrication des instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Instruction 2.1 Exemples d’introduction de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Syntaxe de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L’instruction . . . . . . . . . . . . . . . . . . . . . . 3.1 Exemple d’introduction de l’instruction 3.2 Syntaxe de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Exemple d’introduction de l’instruction 4.2 Syntaxe de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L’instruction 5.1 Exemple d’introduction de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Syntaxe de l’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . continue break Les instructions de branchement inconditionnel : . . . , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 L’instruction 6.2 L’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 L’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
break continue goto
do... while
do... while
Exercices
while
while
while
goto
for
for
for
et
5
4
6
La programmation modulaire et les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . 93 94 1 95 2
La fonction : la seule sorte de module existant en C Exemple de définition et d’utilisation d’une fonction en C
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
© Éditions Eyrolles
VII
Delannoy Livre.book Page VIII Mercredi, 6. mai 2009 4:25 16
Programmer en langage C
Table des matières
8
4
3
5 6 7
return
97 Quelques règles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.1 Arguments muets et arguments effectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 L’instruction 98 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Cas des fonctions sans valeur de retour ou sans arguments . . . . . . . . . . . . . . . 99 3.4 Les anciennes formes de l’en-tête des fonctions . . . . . . . . . . . . . . . . . . . . . . . . 100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Les fonctions et leurs déclarations 4.1 Les différentes façons de déclarer (ou de ne pas déclarer) une fonction . . . . . . 101 4.2 Où placer la déclaration d’une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.3 À quoi sert la déclaration d’une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Retour sur les fichiers en-tête En C, les arguments sont transmis par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Les variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 7.1 Exemple d’utilisation de variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.2 La portée des variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.3 La classe d’allocation des variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Les variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 8.1 La portée des variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 8.2 Les variables locales automatiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 8.3 Les variables locales statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 8.4 Le cas des fonctions récursives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 La compilation séparée et ses conséquences . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 9.1 La portée d’une variable globale - la déclaration extern . . . . . . . . . . . . . . . . . . . 111 9.2 Les variables globales et l’édition de liens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 9.3 Les variables globales cachées - la déclaration static . . . . . . . . . . . . . . . . . . . . 112 10 Les différents types de variables, leur portée et leur classe d’allocation . . . . . . 113 10.1 La portée des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 10.2 Les classes d’allocation des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 10.3 Tableau récapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 11 Initialisation des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 11.1 Les variables de classe statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 11.2 Les variables de classe automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 12 Les arguments variables en nombre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 12.1 Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 12.2 Second exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9
7
Les tableaux et les pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Les tableaux à un indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 1 1.1 Exemple d’utilisation d’un tableau en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 1.2 Quelques règles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Les tableaux à plusieurs indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 2.1 Leur déclaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 2.2 Arrangement en mémoire des tableaux à plusieurs indices . . . . . . . . . . . . . . . . 124
2
VIII
© Éditions Eyrolles
Delannoy Livre.book Page IX Mercredi, 6. mai 2009 4:25 16
Table des matières
Programmer en langage C
3
4
7
5 6
Initialisation des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 3.1 Initialisation de tableaux à un indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 3.2 Initialisation de tableaux à plusieurs indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Notion de pointeur – Les opérateurs * et & . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 4.2 Quelques exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 4.3 Incrémentation de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Comment simuler une transmission par adresse avec un pointeur . . . . . . . . . . 130 Un nom de tableau est un pointeur constant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6.1 Cas des tableaux à un indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6.2 Cas des tableaux à plusieurs indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Les opérateurs réalisables sur des pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 7.1 La comparaison de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 7.2 La soustraction de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.3 Les affectations de pointeurs et le pointeur nul . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.4 Les conversions de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.5 Les pointeurs génériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Les tableaux transmis en argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 8.1 Cas des tableaux à un indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 8.2 Cas des tableaux à plusieurs indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Utilisation de pointeurs sur des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 9.1 Paramétrage d’appel de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 9.2 Fonctions transmises en argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
9
8
Publicité
8
2 3 4
Les chaînes de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Représentation des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 1 1.1 La convention adoptée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 1.2 Cas des chaînes constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 1.3 Initialisation de tableaux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 1.4 Initialisation de tableaux de pointeurs sur des chaînes . . . . . . . . . . . . . . . . . . . 148 Pour lire et écrire des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Pour fiabiliser la lecture au clavier : le couple gets sscanf . . . . . . . . . . . . . . . . . 151 Généralités sur les fonctions portant sur des chaînes . . . . . . . . . . . . . . . . . . . . . 153 4.1 Ces fonctions travaillent toujours sur des adresses . . . . . . . . . . . . . . . . . . . . . . 153 4.2 La fonction strlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 4.3 Le cas des fonctions de concaténation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Les fonctions de concaténation de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 5.1 La fonction strcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 5.2 La fonction strncat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Les fonctions de comparaison de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Les fonctions de copie de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Les fonctions de recherche dans une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
6 7 8
5
© Éditions Eyrolles
IX
Delannoy Livre.book Page X Mercredi, 6. mai 2009 4:25 16
Programmer en langage C
Table des matières
9
Les fonctions de conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 9.1 Conversion d’une chaîne en valeurs numériques . . . . . . . . . . . . . . . . . . . . . . . . 158 9.2 Conversion de valeurs numériques en chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . 159 10 Quelques précautions à prendre avec les chaînes . . . . . . . . . . . . . . . . . . . . . . . . 159 10.1 Une chaîne possède une vraie fin, mais pas de vrai début . . . . . . . . . . . . . . . . 159 10.2 Les risques de modification des chaînes constantes . . . . . . . . . . . . . . . . . . . . . 160 11 Les arguments transmis à la fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 11.1 Comment passer des arguments à un programme . . . . . . . . . . . . . . . . . . . . . . 161 11.2 Comment récupérer ces arguments dans la fonction main . . . . . . . . . . . . . . . . 162 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
9
4
3
Les structures et les énumérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Déclaration d’une structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 1 Utilisation d’une structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 2 2.1 Utilisation des champs d’une structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 2.2 Utilisation globale d’une structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 2.3 Initialisations de structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Pour simplifier la déclaration de types : définir des synonymes avec typedef . 169 3.1 Exemples d’utilisation de typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 3.2 Application aux structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Imbrication de structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 4.1 Structure comportant des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 4.2 Tableaux de structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 4.3 Structures comportant d’autres structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 À propos de la portée du modèle de structure . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Transmission d’une structure en argument d’une fonction . . . . . . . . . . . . . . . . . 174 6.1 Transmission de la valeur d’une structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 6.2 Transmission de l’adresse d’une structure : l’opérateur -> . . . . . . . . . . . . . . . . . 175 Transmission d’une structure en valeur de retour d’une fonction . . . . . . . . . . . 177 Les énumérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 8.1 Exemples introductifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 8.2 Propriétés du type énumération . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
5 6
7 8
1 2 3
10 Les fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Création séquentielle d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Liste séquentielle d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 L’accès direct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 3.1 Accès direct en lecture sur un fichier existant . . . . . . . . . . . . . . . . . . . . . . . . . . 186 3.2 Les possibilités de l’accès direct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 3.3 En cas d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Les entrées-sorties formatées et les fichiers de texte . . . . . . . . . . . . . . . . . . . . . 189 Les différentes possibilités d’ouverture d’un fichier . . . . . . . . . . . . . . . . . . . . . . 191
4 5
X
© Éditions Eyrolles
Delannoy Livre.book Page XI Mercredi, 6. mai 2009 4:25 16
Table des matières
Programmer en langage C
6
Les fichiers prédéfinis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
11
La gestion dynamique de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Les outils de base de la gestion dynamique : malloc et free . . . . . . . . . . . . . . . 196 1 1.1 La fonction malloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 1.2 La fonction free . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 D’autres outils de gestion dynamique : calloc et realloc . . . . . . . . . . . . . . . . . 199 2.1 La fonction calloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 2.2 La fonction realloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Exemple d’application de la gestion dynamique : création d’une liste chaînée . 200
3
2
Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
1
12 Le préprocesseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 La directive #include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 La directive #define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 2.1 Définition de symboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 2.2 Définition de macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 La compilation conditionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
3
2
3.1 Incorporation liée à l’existence de symboles . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 3.2 Incorporation liée à la valeur d’une expression . . . . . . . . . . . . . . . . . . . . . . . . . . 212
13 Les possibilités du langage C proches de la machine . . . . . . . . . . . . . . . . . . . . 215 1 Compléments sur les types d’entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
1.1 Rappels concernant la représentation des nombres entiers en binaire . . . . . . . 216 1.2 Prise en compte d’un attribut de signe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 1.3 Extension des règles de conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 1.4 La notation octale ou hexadécimale des constantes . . . . . . . . . . . . . . . . . . . . . 217 Compléments sur les types de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
2.1 Prise en compte d’un attribut de signe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 2.2 Extension des règles de conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Les opérateurs de manipulation de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
3.1 Présentation des opérateurs de manipulation de bits . . . . . . . . . . . . . . . . . . . . . 220 3.2 Les opérateurs bit à bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 3.3 Les opérateurs de décalage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 3.4 Exemples d’utilisation des opérateurs de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Les champs de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Les unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
2
3
4
5
© Éditions Eyrolles
XI
Delannoy Livre.book Page XII Mercredi, 6. mai 2009 4:25 16
Programmer en langage C
Table des matières
Annexe 1
Les principales fonctions de la bibliothèque standard . . . . . . . . . . . . . . . . 227 Entrées-sorties (stdio.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
1.1 Gestion des fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 1.2 Écriture formatée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Les codes de format utilisables avec ces trois fonctions . . . . . . . . . . . . . . . . . . 229 1.3 Lecture formatée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 Règles communes à ces fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Les codes de format utilisés par ces fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . 233 1.4 Entrées-sorties de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 1.5 Entrées-sortie