LE LANGAGE C - Free

Le langage C est né en 1973 aux Laboratoires de la compagnie Bell. ... de
développement, d'exercices corrigés, gestion de l'allocation dynamique de listes
chaînées, fonctions à ... Les fonctions et les pointeurs sont présentées au
chapitre 5.

Part of the document



Le langage C


JACQUES PHILIPP


Consultant


Copyright : Systèmes Ouverts Conseils


9 mai 2002



AVANT-PROPOS


Le langage C est né en 1973 aux Laboratoires de la compagnie Bell. Il a été
conçu par Brian Kernighan et Denis Ritchie pour écrire le système
d'exploitation UNIX (défini par Ken Thompson et Denis Ritchie) dans un
langage évolué. Ainsi, UNIX est écrit à 90% en C dès 1973. C'est une
révolution puisque à cette époque, tous les systèmes d'exploitation à
l'exception de MULTICS écrit en PL/1 dès 1965, sont écrits en assembleur.


A cette époque commencent à apparaître nettement les différents concepts de
la programmation structurée dus à ARSAC, DIJKSTRA, GRIES, KNUTH, WIRTH
(Langage PASCAL)...


On retrouve tous ces concepts dans C; on y trouve également des
possibilités de manipulation de données que l'on ne pouvait réaliser
jusqu'alors qu'en assembleur : manipulation de bits, d'octets...


C'est à la fois un langage de développement et un langage de programmation
système. Compte tenu de sa puissance, il est nécessaire d'avoir une bonne
expérience préalable de la programmation pour l'utiliser à bon escient.
L'étudiant idéal devrait maîtriser un langage structuré de type PASCAL et
un langage assembleur. Il est fortement déconseillé à un débutant de même
qu'il est déconseillé de mettre une FERRARI dans une auto école....


UNIX et C sont très intimement liés : c'est pourquoi un utilisateur d'une
machine fonctionnant sous UNIX est souvent amené à utiliser et connaître le
langage C.


Nous nous sommes attachés à présenter les concepts normalisés du langage,
issus de la "bible" du langage C "The C programming langage" (version
anglaise) de Kernighan et Ritchie dont nous conseillons l'acquisition à
tout lecteur désireux d'approfondir ses connaissances en C et en
programmation structurée. Sa première version, datant de 1978, n'en
présente pas les tous derniers développements. Une deuxième édition,
conforme à la norme ANSI X3J11 (1988) qui impose des modifications dans la
définition des fonctions et qui a permis une définition rigoureuse des
bibliothèques C, a été publiée. Nous en avons tenu compte dans la totalité
des exemples présentés.


Cette édition a été enrichie : ajout des outils de développement,
d'exercices corrigés, gestion de l'allocation dynamique de listes chaînées,
fonctions à nombre d'arguments variables, etc.


Le chapitre 1 s'intitule "Démarrer en C" : il présente très sommairement
les concepts de base de façon à permettre au lecteur d'écrire rapidement un
petit programme en C et de comprendre les instructions de base du langage.


Dans le chapitre 2 sont présentés la philosophie du langage, les
déclarations de types des variables et les opérateurs binaires du langage.


Les structures de contrôle (boucles et tests) sont présentées au chapitre
3.


Dans le chapitre 4, on trouvera la gestion des classes de mémorisation des
variables, les règles d'initialisation des variables ainsi que les
principes d'utilisation du préprocesseur.


Les fonctions et les pointeurs sont présentées au chapitre 5.


Au chapitre 6 sont présentées les concepts orientés objet de définition de
structures de données.


Les instructions d'entrée/sortie de bas niveau sont présentées au chapitre
7.


Les instructions d'entrées/sorties disponibles dans les bibliothèques sont
présentées au chapitre 8.


Les outils de développement standards sous UNIX sont présentés au chapitre
9.


On trouvera en annexe la description des principales bibliothèques
utilisées en programmation C, une description concise des apports de la
norme ANSI, les corrigés des exercices proposés, un index.



Table des matières


1. DEMARRER EN C 10

1.1 Généralités sur la structure des programmes 10

1.2 Fonctions élémentaires d'Entrée-Sortie 11
1.2.1 Entrées/sorties sur des caractères sans spécification de format
11
1.2.2 Entrées/sorties avec spécification de format 12

1.3 3 Structures de contrôle élémentaires 12
1.3.1 Boucles 12
1.3.2 Exemples de programme en C 13
1.3.3 Tests 14
1.3.4 Utilisation des fonctions 15

2. TYPES, OPERATEURS ET EXPRESSIONS 17

2.1 Esprit, règles de bonne programmation et maximes 17
2.1.1 Esprit du langage C 17
2.1.2 Règles générales de programmation et de portabilité 18
2.1.3 Les maximes 18

2.2 Principes généraux du langage 19
2.2.1 Expressions et instructions 19
2.2.2 Mots clés du langage C 20

2.3 Variables 21
2.3.1 Identificateur, type et classe d'allocation 21
2.3.2 Définition et déclaration 21
2.3.3 Règles d'utilisation des variables 22
2.3.4 Accès aux variables 22
2.3.5 Lvaleur, Rvaleur et affectation 23

2.4 Types 23
2.4.1 Types scalaires 25
2.4.2 Qualificatif 25
2.4.3 Tableau 27
2.4.4 Conversions de type implicites 28
2.4.5 Conversion de type explicite 29
2.4.6 Diagramme de définition des variables 30

2.5 Variables qualifiées constantes 31
2.5.1 Variables qualifiées constantes entières 32
2.5.2 Variables qualifiées constantes réelles 32
2.5.3 Variables qualifiées constantes de type caractère 32
2.5.4 Variables qualifiées constantes de type chaîne de caractères 33

2.6 Opérateurs 34
2.6.1 Opérateurs binaires 34
2.6.2 Opérateurs d'incrémentation et décrémentation 35
2.6.3 Opérateurs composés 37
2.6.4 Opérateurs sur les champs de bits 37
2.6.5 L'opérateur sizeof 40
2.6.6 Calcul de l'espace mémoire occupé par un tableau 41

2.7 Tableau Récapitulatif des opérateurs BINAIRES 43

2.8 Priorité et règles d'associativité des opérateurs 43

3. STRUCTURES DE CONTROLE 45

3.1 Les tests 45
3.1.1 L'instruction if else 45
3.1.2 L'opérateur ternaire 45
3.1.3 La construction else if 46

3.2 Les boucles 46
3.2.1 La boucle while 47
3.2.2 La boucle for 47
3.2.3 La boucle do while 49

3.3 Les instructions de rupture de sequence 49
3.3.1 L'instruction break 50
3.3.2 L'instruction continue 51
3.3.3 L'instruction goto 51

3.4 Branchement multiple : l'instruction switch 52

4. Classes de mémorisation ET PRéPROCESSEUR 54

4.1 Classes de mémorisation 54
4.1.1 Variables globales 54
4.1.2 Variables locales 57
4.1.3 Variables automatiques 58
4.1.4 Variables statiques 58
4.1.5 Variables de type register 60

4.2 Initialisations 60
4.2.1 Variables statiques et variables externes 60
4.2.2 Variables automatiques et registres 60
4.2.3 Tableaux d'entiers ou de réels 61
4.2.4 Initialisation de chaînes de caractères 62
4.2.5 Chaînes de caractères et pointeurs 63
4.2.6 Variables qualifiées 64

4.3 Généralités sur le préprocesseur 64
4.3.1 Inclusion de fichiers 65
4.3.2 Généralités sur les macro-définitions 65
4.3.3 Macro-définition de type constante 65
4.3.4 Macro-définition de type fonction 67
4.3.5 L'opérateur # 69
4.3.6 Compilation conditionnelle 71
4.3.7 Variable locales et préprocesseur 72

5. FONCTIONS ET POINTEURS 74

5.1 Généralités 74

5.2 Règles d'utilisation des fonctions 74
5.2.1 Définition 74
5.2.2 Règles élémentaires d'utilisation 76
5.2.3 Déclaration et prototypes 76
5.2.4 Appel 77
5.2.5 Le mot clé void 78
5.2.6 Transmission du résultat 79
5.2.7 Type du résultat 79
5.2.8 Récursivité 80
5.2.9 Modes de transmission des arguments 81
5.2.10 Cas particulier des tableaux 83

5.3 Pointeurs 84
5.3.1 Définitions 84
5.3.2 Définitions et déclarations 86
5.3.3 Exemples de définitions 86

5.4 Arguments de fonctions et pointeurs 88

5.5 Tableaux et pointeurs 91
5.5.1 Calcul d'adresse 91
5.5.2 Correspondance tableau-pointeur 91
5.5.3 Opérations sur les pointeurs 96
5.5.4 Conversion de pointeurs 96
5.5.5 Le pointeur générique 97

5.6 Chaînes de caractères et pointeurs 97
5.6.1 Règles d'initialisation 97
5.6.2 Exemples d'initialisation 98
5.6.3 Taille 101
5.6.4 Recopie 102
5.6.5 Comparaison 102
5.6.6 Concaténation 103

5.7 Quelques applications des pointeurs 103
5.7.1 Transmission d'arguments à la fonction main 103
5.7.2 Pointeur sur des tableaux et tableaux de pointeurs 105
5.7.3 Transtypage et pointeurs 108
5.7.4 Pointeurs sur des fonctions 109

5.8 Allocation dynamique de la mémoire 110
5.8.1 Allocation dynamique 110
5.8.2 Libération 110

5.9 Fonction à nombre d'arguments variable 111
5.9.1 Principe général 111
5.9.2 Gestion de la pile des arguments 111
5.9.3 Le type va_list 112
5.9.4 La fonction va_start 112
5.9.5 La fonction va_arg 112
5.9.6 La fonction va_end 112

6. STRUCTURES DE DONNEES 115

6.1 Structures 115
6.1.1 Définition 115
6.1.2 Déclaration et définition 115
6.1.3 Règles d'utilisations 116
6.1.4 Accès aux champs d'une structure : l'opérateur de sélection de
membre 117
6.1.5 Pointeurs sur des structures : l'opérateur -> 117
6.1.6 Associativité des opérateurs * ->++ -- () [ ] 119
6.1.7 Pointeurs, structures et fonctions 121
6.1.8 Tableau d