Vous êtes sur la page 1sur 22

www.ncottin.

net

Pratique du langage C
Introduction Notions fondamentales Concepts avancs
Nathanal Cottin
22 dcembre 2006

Avant-propos
Ce document explique les principaux points dlicats du langage C Il na pas pour vocation dintroduire lensemble des lments du langage C, notamment syntaxiques, supposs connus Il aborde des concepts dutilisation volue du langage C

22 dcembre 2006

Pratique du langage C

Plan gnral
Partie 1 : Principaux types de donnes Partie 2 : Variables et pointeurs Partie 3 : Les tableaux Partie 4 : Passage de paramtres aux fonctions Annexes : Concepts volus du langage

22 dcembre 2006

Pratique du langage C

www.ncottin.net

Partie 1 Principaux types de donnes


Types lmentaires Types volus Types drivs

22 dcembre 2006

Pratique du langage C

Types lmentaires
Type entier : long , int , short Type caractre : char Types rel : long double , double et float Type boolen : int , sachant que la valeur logique faux sexprime par 0 et vrai par toute autre valeur (gnralement 1) Types drivs ( unsigned , etc.)

22 dcembre 2006

Pratique du langage C

Espace mmoire occup


Type lmentaire long int short char long double double float
22 dcembre 2006

Taille (en octets) 4 2 ou 4 2 1 10 8 4

Pratique du langage C

Types volus : tableaux (1/2)


Tableaux :
Donnes stockes en mmoire de manire contigu Nom attribu au tableau = pointeur sur son premier lment

Exemple :
int tab[] = {11, 22, 33, 44, 55};

22 dcembre 2006

Pratique du langage C

Types volus : tableaux (2/2)


Chane de caractres : tableau de char termin par le caractre spcial '\0' Exemple :
char maChaine[] = "Hello world!";

22 dcembre 2006

Pratique du langage C

Types drivs (1/2)


Type numr :
enum bool {FALSE,TRUE,FAUX=0,VRAI};
Les identificateurs de la liste numre sont des constantes entires commenant par dfaut 0 et incrmentes La valeur entire dun identificateur peut tre spcifie. Dans ce cas, les valeurs des identifiants suivants la prennent pour rfrence

Ainsi : FALSE = 0, TRUE = 1 FAUX = 0 et VRAI = 1 Donc : FALSE = FAUX = 0 et TRUE = VRAI = 1

Structure :
struct personne {char *nom; char *prenom;};
22 dcembre 2006 Pratique du langage C 9

Types drivs (2/2)


Union :
union nombre {int nbInt; long nbLong;};
La quantit de mmoire rserve lors de lallocation(automatique ou dynamique) correspond llment le plus gourmand ( long dans cet exemple)

Champs de bits : (type entier en mmoire)


struct bits {int b1:1; int b2:15;};
b2 (15 bits) b1 (1 bit) poids faible

22 dcembre 2006

Pratique du langage C

10

www.ncottin.net

Partie 2 Variables et pointeurs


Relations Usage

22 dcembre 2006

Pratique du langage C

11

Dfinitions
Une dclaration de variable rserve un certain nombre de blocs en mmoire selon le type de cette variable. Le premier bloc mmoire occup est suppos rserv ladresse @ Un pointeur occupe une taille fixe (type entier) en mmoire. Il rfrence une variable (ou NULL)

22 dcembre 2006

Pratique du langage C

12

Relations variable / pointeur


Dclaration dune variable entire : int i;
@i dsigne ladresse mmoire de la variable i

Dclaration dun pointeur sur un entier : int *p;


@p dsigne ladresse mmoire du pointeur p

p rfrence la variable i : p = &i;


& est un oprateur de drfrencement

22 dcembre 2006

Pratique du langage C

13

Assignation dune valeur


Assignation directe : i = 10;

Assignation indirecte : *p = 10;


* permet de se rendre ladresse pointe par p Le symbole * est utilis la fois pour dclarer une variable de type pointeur et pour accder la valeur pointe

22 dcembre 2006

Pratique du langage C

14

www.ncottin.net

Partie 3 Les tableaux


Dfinition Dclaration Accs aux lments

22 dcembre 2006

Pratique du langage C

15

Dfinition dun tableau


Tableau :
Donnes stockes en mmoire de manire contigu Nom attribu au tableau = pointeur sur son premier lment :
Constant en cas dallocation automatique Exemple : int tab[10]; , int tab[] = {1, 2, 3}; Variable en cas dallocation dynamique Exemple : int *tab = (int *)malloc(10 * sizeof(int));

22 dcembre 2006

Pratique du langage C

16

Dclaration dun tableau


Avec allocation automatique :
char str[] = "azerty"; char str[] = {'a', 'z', 'e', 'r', 't', 'y','\0'};

Avec allocation dynamique :


char str[] = (char *)calloc(7 * sizeof(char));

Le tableau nest pas initialis Le dernier lment est rserv pour \0 Utilisation de free imprative

22 dcembre 2006

Pratique du langage C

17

Accs aux lments dun tableau


Premier lment accessible via lindice 0 Tableau de 10 entiers : int tab[10]; :
Initialiser le 1er lment la valeur 5 :
tab[0] = 5; *tab = 5;
tab est un pointeur sur son premier lment

Rcuprer la valeur du 8me lment :


int v = tab[7]; int v = *(tab + 7);
En effet, tab + 7 &tab[7] car tab est un pointeur sur tab[0]

22 dcembre 2006

Pratique du langage C

18

www.ncottin.net

Partie 4 Les fonctions


Dfinition Passage des arguments

22 dcembre 2006

Pratique du langage C

19

Dfinition
Une fonction est un sous-programme ralisant une partie du traitement demand Une fonction renvoie ou non une valeur On appelle procdure une fonction qui ne retourne aucun rsultat ( void ) Lexcution peut dpendre de paramtres donns lors de lappel de la fonction

22 dcembre 2006

Pratique du langage C

20

10

Appel dune fonction


Ladresse de retour du programme est empile Les variables passes en argument lors de lappel dune fonction sont empiles (par copie) Un saut inconditionnel est effectu pour excuter le code associ la fonction Lappel de la fonction dpile les paramtres dont elle a besoin Le code est excut Ladresse de retour est dpile Le rsultat (si prsent) est empil Le programme se poursuit ladresse de retour
22 dcembre 2006 Pratique du langage C 21

Passage des arguments


Passage par valeur : passage direct, aucune modification possible de la valeur Passage par pointeur : passage indirect, possibilit de modifier la variable pointe Passage par rfrence : cas particulier de passage par pointeur (indirection)
Les variables passes en argument sont empiles avant dexcuter le code associ la fonction : une copie (lue dans la pile) est donc utilise par la fonction Ce qui explique que le passage par valeur ne modifie pas la variable du programme appelant

22 dcembre 2006

Pratique du langage C

22

11

Passage par valeur


Dclaration :
void fonctionSimple(int param) {}

Appel :
fonctionSimple(i);
Avant excution : i est empil Dbut dexcution : le haut de la pile est dpil ; param est une copie de i

22 dcembre 2006

Pratique du langage C

23

Passage par pointeur


Dclaration :
void autreFonction(int *pParam) {}

Appel :
autreFonction(p);

pParam rfrence toujours la variable i ; il sagit dune copie du pointeur p

22 dcembre 2006

Pratique du langage C

24

12

Passage par rfrence


Dclaration :
void autreFonction(int *pParam) {}

Appel :
autreFonction(&i);

pParam rfrence toujours la variable i car il contient ladresse de cette dernire

22 dcembre 2006

Pratique du langage C

25

Modification des arguments


Quel que soit le type de passage du paramtre (valeur, pointeur ou rfrence), une copie est utilise par la fonction appele (utilisation de la pile) La variable passe en argument par valeur ne peut tre modifie directement Il faut passer par une rfrence cette variable en utilisant & ou en dclarant un pointeur sur cette variable

22 dcembre 2006

Pratique du langage C

26

13

Exemple : change de valeurs


Dclaration incorrecte :
int echange(int a, int b) {}
Lappel de cette fonction induit une recopie des variables passes en paramtres. Par consquent les valeurs initiales restent inchanges suite lexcution de la fonction (cf fonctionSimple )

Dclaration correcte :
int echange(int *a, int *b) { int tmp = *b; *b = *a; *a = tmp; }
22 dcembre 2006 Pratique du langage C 27

Types volus et drivs en argument


Le principe dutilisation de la pile reste valable Les types volus non grs explicitement laide dallocation dynamique sont copis en intgralit dans la pile avant lappel de fonction Les donnes accessibles par rfrence dans la variable dorigine demeurent accessibles (i.e. les pointeurs internes permettent de modifier les variables pointes (sauf si dclaration constante const Cf annexes section 1)

22 dcembre 2006

Pratique du langage C

28

14

www.ncottin.net

Annexes Concepts volus du langage


Arguments constants Pointeurs vers fonctions Divers

22 dcembre 2006

Pratique du langage C

29

www.ncottin.net

Annexe 1 Arguments constants

22 dcembre 2006

Pratique du langage C

30

15

Utilisation du mot-cl const


Permet de limiter laccs une variable ou un pointeur Le contenu de la variable (valeur ou adresse mmoire si pointeur) ne peut tre modifi : on parle de lecture seule ( read only ) Une rfrence obtenue laide de & est implicitement dclare const (Cf autreFonction(&i) )

22 dcembre 2006

Pratique du langage C

31

Utilisation lgale des constantes


Dclaration :
const double pi = 3.141592654;

Instructions lgales :
Passage de pi en tant que paramtre dune fonction Assignation de la valeur dune variable i : double i = pi; Drfrencement dans pointeur constant : const double *p = π

22 dcembre 2006

Pratique du langage C

32

16

Utilisation non autorise


Instructions illgales :
Changement de valeur : pi = 3.1416; Drfrencement dans pointeur non constant : int *p = π const int *p = π

Attention :
Instructions valides pour le compilateur ! Il sagit plus de conventions dcriture

22 dcembre 2006

Pratique du langage C

33

Fonction argument constant


Utile en cas dargument de type pointeur Dclaration :
void testConst(const int *pParam) {}

Corps de la fonction :
void testConst(const int *pParam) { *pParam = 1; }
Contrairement la dclaration de variables, le compilateur refuse de compiler linstruction dassignation de la valeur au paramtre constant
22 dcembre 2006 Pratique du langage C 34

/* Erreur de compilation */

17

www.ncottin.net

Annexe 2 Les pointeurs vers fonctions

22 dcembre 2006

Pratique du langage C

35

Dfinition
Nom de fonction = pointeur constant sur la fonction Sa valeur correspond ladresse mmoire de la premire instruction de la fonction Il est possible de dclarer un pointeur (variable) destin rfrencer une fonction

22 dcembre 2006

Pratique du langage C

36

18

Dclaration
Exemple :
int (*pFonction)(const char *);

Lemploi des premires parenthses est obligatoire :


int *pFonction(const char *);

est une dclaration de prototype de fonction retournant un pointeur sur un entier et non un pointeur sur une fonction

22 dcembre 2006

Pratique du langage C

37

Appel
Exemple (suite) :
pFonction = puts; (*pFonction)("Appel de la fonction puts");

La signature de la fonction utilise (il sagit ici de puts ) doit correspondre la dclaration du pointeur sur fonction Les parenthses sont galement obligatoires

22 dcembre 2006

Pratique du langage C

38

19

Excution mmoire
La fonction puts est enregistre (comme toute autre fonction) une adresse en mmoire correspondant la premire instruction de son corps

pFonction = puts;
pFonction renvoie galement la premire instruction du bloc de puts
22 dcembre 2006 Pratique du langage C 39

www.ncottin.net

Annexe 3 Divers

22 dcembre 2006

Pratique du langage C

40

20

Fonctions inline
Valable pour les fonctions courtes Le compilateur neffectue pas dappel aux fonctions inline mais recopie directement leur code Exemple :
inline int plusGrandOuEgal(int a, int b) { return a >= b; }

22 dcembre 2006

Pratique du langage C

41

Fonctions arguments variables (1/2)


Au minimum un argument obligatoire Autres arguments facultatifs Exemple : affichage dentiers
#include <stdio.h> #include <stdarg.h> void afficherEntiers(int val, ) { int arg = val; va_list argList; /* Liste des arguments facultatifs */ va_start(argList, val); /* Initialisation de la liste */ while (arg != 0) { printf("%d ", arg); arg = va_arg(argList, int); /* Argument suivant (et type) */ } va_end(argList); /* Clture de la liste des arguments */ }
22 dcembre 2006 Pratique du langage C 42

21

Fonctions arguments variables (2/2)


Appel de cette fonction :
void main() { afficherEntiers(1, 2, 3, 4, 5, 0); }
Permet de terminer la boucle de lecture des paramtres facultatifs

22 dcembre 2006

Pratique du langage C

43

22