Vous êtes sur la page 1sur 41

Branchement conditionnel if---else

if(i > 0) printf("i is positive\n"); else printf("i is negative\n");

if(i > 0) printf("i is positive\n"); else { printf("i is negative\n"); i = -i; }

Massour El Auod ( Langage C )

printf("input an integer: "); scanf("%i", &j); if(j > 0); printf("a positive number was entered\n"); input an integer: -6

a positive number was entered

Massour El Auod ( Langage C )

Branchement multiple switch


Sa forme la plus gnrale est celle-ci : switch (expression ) {case constante-1: case constante-2: ... case constante-n: liste d'instructions n; break; default: liste d'instructions ;break; } la valeur de expression est gale l'une des constantes, la liste d'instructions correspondant est excute. Sinon la liste d'instructions correspondant default est excute. L'instruction default est facultative. Massour El Auod ( Langage C ) liste d'instructions 1 ; break; liste d'instructions 2 ;break;

Branchement multiple switch


Le test seffectue que sur les entiers Si la condition est verifi, linstruction default est execut Si il ny a pas de defaut pas derreur The break est important
float f; switch(f) { case 2: .... i = 3; switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n"); } i = 3 i = 2 i = 1

Massour El Auod ( Langage C )

Les boucles
Les boucles permettent de rpter une srie d'instructions tant qu'une certaine condition n'est pas vrifie. Boucle while Boucle do---while Boucle for

Massour El Auod ( Langage C )

while
La syntaxe de while est la suivante :
while (expression ) Instruction

int j = 5; while(j > 0) printf("j = %i\n", j--); while(j > 0) { printf("j = %i\n", j); j--; } j j j j j = = = = = 5 4 3 2 1

Cest quoi la diffrence ? Entre les deux programmes


int j = 5; while(j > 0); printf("j = %i\n", j--);

Massour El Auod ( Langage C )

Boucle do---while
Il peut arriver que l'on ne veuille effectuer le test de continuation qu'aprs avoir excut l'instruction. Dans ce cas, on utilise la boucle do---while. Sa syntaxe est: Do instruction while (expression ); Cela signifie donc que instruction toujours excute au moins une fois. est

Massour El Auod ( Langage C )

Exemple
int j = 5; printf("start\n"); do printf("j = %i\n", j--); while(j > 0); printf("stop\n"); start j = 5 j = 4 j = 3 j = 2 j = 1 stop

int j = -10; printf("start\n"); do { printf("j = %i\n", j); j--; } while(j > 0); printf("stop\n");

start j = -10 stop

Massour El Auod ( Langage C )

Boucle for
La syntaxe de for est : for (expr 1 ;expr 2 ;expr 3) instruction for(initial-part; while-condition; update-part)
int j; for(j = 5; j > 0; j--) printf("j = %i\n", j); j j j j j = = = = = 5 4 3 2 1 j j j j j = = = = = 5 4 3 2 1 impair pair impair pair impair

for(j = 5; j > 0; j--) { printf("j = %i ", j); printf("%s\n", ((j%2)==0)?"pair":"impair"); }

Massour El Auod ( Langage C )

int i, j, k; for(i = 0, j = 5, k = -1; i < 10; i++, j++, k--)

for(; i < 10; i++, j++, k--) for(;i < 10;)

for(;;)

Boucle infinie

Massour El Auod ( Langage C )

Les instructions de branchement non conditionnel L'instruction break peut, plus gnralement, tre employe l'intrieur de n'importe quelle boucle. Elle permet d'interrompre le droulement de la boucle, et passe la premire instruction qui suit la boucle. En cas de boucles imbriques, break fait sortir de la boucle la plus interne:

Massour El Auod ( Langage C )

Exemple
main() { int i; for (i = 0; i < 5; i++) { printf("i = %d\n",i); if (i == 3) break; } printf("valeur de i a la sortie de la boucle = %d\n",i); } Massour El Auod ( Langage C )
i=0 i=1 i=2 i=3 valeur de i a la sortie de la boucle = 3

Eemple 2
for(;;) { printf("type an int: "); if(scanf("%i", &j) == 1) break; while((c = getchar()) != '\n') ; } printf("j = %i\n", j); type an int: an int type an int: no type an int: 16 j = 16

Massour El Auod ( Langage C )

Branchement non conditionnel continue


L'instruction continue permet de passer directement au tour de boucle suivant, sans excuter les autres instructions de la boucle.
main() {int i; for (i = 0; i < 5; i++) { if (i == 3) continue; printf("i = %d\n",i); } printf("valeur de i a la sortie de la boucle = %d\n",i); } i=0 i=1 i=2 i=4 valeur de i a la sortie de la boucle = 5

Massour El Auod ( Langage C )

Impression et lecture de caractres


Les fonctions getchar et putchar permettent respectivement de lire et d'imprimer des caractres. Il s'agit de fonctions d'entres-sorties non formates. La fonction getchar retourne un int correspondant au caractre lu. Pour mettre le caractre lu dans une variable caractre, on crit caractre = getchar( ); Lorsqu'elle dtecte la fin de fichier, elle retourne l'entier EOF (End Of File), valeur dfinie dans la librairie stdio.h. En gnral, la constante EOF vaut -1 La fonction putchar crit caractre sur la sortie standard : putchar(caractere); Elle retourne un int correspondant l'entier lu ou la constante EOF en cas d'erreur.

Massour El Auod ( Langage C )

Exemple
Exemple: #include <stdio.h> main() { char c; while ((c = getchar()) != EOF) putchar(c); }
Massour El Auod ( Langage C )

Linstruction goto
Elle permet classiquement le branchement en un emplacement quelconque du programme. Exemple: on simule, dans une boucle for, linstruction break laide de linstruction goto
main() { int i ; for ( i=1 ; i<=1 0 ; i++ ) { printf ("dbut tour %d\n", i) ; printf ("bonjour\n") ; if ( i==3 ) goto sortie ; printf ("fin tour %d\n", i) ; } sortie : printf ("aprs la boucle") ; }

dbut tour 1 bonjour fin tour 1 dbut tour 2 bonjour fin tour 2 dbut tour 3 bonjour aprs la boucle

Massour El Auod ( Langage C )

La programmation modulaire et les fonctions


Dans certains langages, on trouve deux sortes de modules, savoir :
Les fonctions, assez proches de la notion mathmatique correspondante. Notamment, une fonction dispose darguments (en C, comme dans la plupart des autres langages, une fonction peut ne comporter aucun argument) qui correspondent des informations qui lui sont transmises et elle fournit un unique rsultat scalaire (simple) ; dsign par le nom mme de la fonction, ce dernier peut apparatre dans une expression. On dit dailleurs que la fonction possde une valeur et quun appel de fonction est assimilable une expression.

Massour El Auod ( Langage C )

Les procdures (terme Pascal) ou sousprogrammes (terme Fortran ou Basic) qui largissent la notion de fonction. La procdure ne possde plus de valeur proprement parler et son appel ne peut plus apparatre au sein dune expression. Par contre, elle dispose toujours darguments.
De plus, une procdure peut raliser une action, par exemple afficher un message (en fait, dans la plupart des langages, la fonction peut quand mme raliser une action, bien que ce ne soit pas l sa vocation).
Massour El Auod ( Langage C )

Introduction Fonction
Comme dans la plupart des langages, on peut en C dcouper un programme en plusieurs fonctions. Une seule de ces fonctions existe obligatoirement ; c'est la fonction principale appele main. Cette fonction principale peut, ventuellement, appeler une ou plusieurs fonctions secondaires. De mme, chaque fonction secondaire peut appeler d'autres fonctions secondaires ou s'appeler ellemme (dans ce dernier cas, on dit que la fonction est rcursive).

Massour El Auod ( Langage C )

10

Dfinition
La dfinition d'une fonction est la donne du texte de son algorithme, qu'on appelle corps de la fonction. Elle est de la forme/ type nom-fonction (type-1 arg-1,...,type-n arg-n) { [dclarations de variables locales ] liste d'instructions }

Massour El Auod ( Langage C )

Dfinition
Le corps de la fonction dbute ventuellement par des dclarations de variables, qui sont locales cette fonction. Il se termine par l'instruction de retour la fonction appelante, return, dont la syntaxe est return(expression); La valeur de expression est la valeur que retourne la fonction. Son type doit tre le mme que celui qui a t spcifi dans l'en-tte de la fonction.

Massour El Auod ( Langage C )

11

Exemples de fonction
int produit (int a, int b) { return(a*b); } int puissance (int a, int n) { if (n == 0) return(1); return(a * puissance(a, n-1)); }
double absom (double u, double v) { double s ; s=u+v; if (s>0) return (s) ; else return (-s) } Massour El Auod ( Langage C )

Appel dune fonction


L'appel d'une fonction se fait par l'expression: nom-fonction(para-1,para-2,...,para-n) L'ordre et le type des paramtres effectifs de la fonction doivent concorder avec ceux donns dans l'en-tte de la fonction. Les paramtres effectifs peuvent tre des expressions. La virgule qui spare deux paramtres effectifs est un simple signe de ponctuation ; il ne s'agit pas de l'oprateur virgule. Cela implique en particulier que l'ordre d'valuation des paramtres effectifs n'est pas assur et dpend du compilateur. Il est donc dconseill, pour une fonction plusieurs paramtres, de faire figurer des oprateurs d'incrmentation ou de dcrmentation (++ ou --) dans les expressions dfinissant les paramtres effectifs
Massour El Auod ( Langage C )

12

Dclaration d'une fonction


Le C n'autorise pas les fonctions imbriques. La dfinition d'une fonction secondaire doit donc tre place soit avant, soit aprs la fonction principale main. Toutefois, il est indispensable que le compilateur ``connaisse'' la fonction au moment o celle-ci est appele. Si une fonction est dfinie aprs son premier appel (en particulier si sa dfinition est place aprs la fonction main), elle doit imprativement tre dclare au pralable. Une fonction secondaire est dclare par son prototype, qui donne le type de la fonction et celui de ses paramtres, sous la forme : type nom-fonction(type-1,...,type-n);
Massour El Auod ( Langage C )

Dclaration d'une fonction


Les fonctions secondaires peuvent tre dclares indiffremment avant ou au dbut de la fonction main. Par exemple, on crira :
int puissance (int, int );

int puissance (int a, int n)


{ if (n == 0) return(1);

return(a * puissance(a, n-1)); } main() { int a = 2, b = 5; printf("%d\n", puissance(a,b)); }


Massour El Auod ( Langage C )

13

Quand une fonction ne renvoie pas de rsultat, on le prcise, la fois dans len-tte et dans sa dclaration, laide du mot-cl void. Par exemple, voici len-tte dune fonction recevant un argument de type int et ne fournissant aucune valeur : void sgval (int n) et voici quelle serait sa dclaration : void sgval (int) ; Naturellement, la dfinition dune telle fonction ne doit, en principe, contenir aucune instruction return. Certains compilateurs ne dtecteront toutefois pas lerreur.

Massour El Auod ( Langage C )

Enfin, rien nempche de raliser une fonction ne possdant ni arguments ni valeur de retour. Dans ce cas, son en-tte sera de la forme : void message (void) et sa dclaration sera : void message (void) ;

Massour El Auod ( Langage C )

14

Dure de vie des variables


Les variables manipules dans un programme C ne sont pas toutes traites de la mme manire. En particulier, elles n'ont pas toutes la mme dure de vie. On distingue deux catgories de variables: Les variables permanentes (ou statiques) Les variables temporaires

Massour El Auod ( Langage C )

Les variables permanentes (ou statiques) Une variable permanente occupe un emplacement en mmoire qui reste le mme durant toute l'excution du programme. Cet emplacement est allou une fois pour toutes lors de la compilation. La partie de la mmoire contenant les variables permanentes est appele segment de donnes. Par dfaut, les variables permanentes sont initialises zro par le compilateur. Elles sont caractrises par le mot-clef static.
Massour El Auod ( Langage C )

15

Les variables temporaires


Les variables temporaires Les variables temporaires se voient allouer un emplacement en mmoire de faon dynamique lors de l'excution du programme. Elles ne sont pas initialises par dfaut. Leur emplacement en mmoire est libr par exemple la fin de l'excution d'une fonction secondaire. Par dfaut, les variables temporaires sont situes dans la partie de la mmoire appele segment de pile. Dans ce cas, la variable est dite automatique. Le spcificateur de type correspondant, auto, est rarement utilis puisqu'il ne s'applique qu'aux variables temporaires qui sont automatiques par dfaut. La dure de vie des variables est lie leur porte, c'est-dire la portion du programme dans laquelle elles sont dfinies.
Massour El Auod ( Langage C )

Variable globale
On appelle variable globale une variable dclare en dehors de toute fonction. Une variable globale est connue du compilateur dans toute la portion de code qui suit sa dclaration. Les variables globales sont systmatiquement permanentes. Dans le programme suivant, n est une variable globale :

Massour El Auod ( Langage C )

16

Exemple
int n; void fonction() { n++; printf("appel numero %d\n",n); return; } main() { int i; for (i = 0; i < 5; i++) fonction(); } La variable n est initialise zro par le compilateur et il s'agit d'une variable permanente. En effet, le programme affiche appel numero 1 appel numero 2 appel numero 3 appel numero 4 appel numero 5

Massour El Auod ( Langage C )

Variables locales
On appelle variable locale une variable dclare l'intrieur d'une fonction (ou d'un bloc d'instructions) du programme. Par dfaut, les variables locales sont temporaires. Quand une fonction est appele, elle place ses variables locales dans la pile. A la sortie de la fonction, les variables locales sont dpiles et donc perdues.

Massour El Auod ( Langage C )

17

Il est toutefois possible de crer une variable locale de classe statique en faisant prcder sa dclaration du mot-clef static : static type nom-de-variable; Une telle variable reste locale la fonction dans laquelle elle est dclare, mais sa valeur est conserve d'un appel au suivant. Elle est galement initialise zro la compilation. Par exemple, dans le programme suivant, n est une variable locale la fonction secondaire fonction, mais de classe statique.
Massour El Auod ( Langage C )

int n = 10; void fonction() { affiche static int n; n++; appel numero 1 printf("appel numero %d\n",n); appel numero 1 return; } appel numero 1 main() appel numero 1 { int i; appel numero 1 for (i = 0; i < 5; i++) fonction(); } Ce programme affiche appel numero 1 appel numero 2 appel numero 3 appel numero 4 appel numero 5 On voit que la variable locale n est de classe statique (elle est initialise zro, et sa valeur est conserve d'un appel l'autre de la fonction). Par contre, il s'agit bien d'une variable locale, qui n'a aucun lien avec la variable globale du mme nom.

Massour El Auod ( Langage C )

18

La compilation spare et ses consquences


le langage C est effectivement un langage que lon peut qualifier doprationnel, cest en partie grce ses possibilits dites de compilation spare. En C, en effet, il est possible de compiler sparment plusieurs programmes (fichiers) source et de rassembler les modules objet correspondants au moment de ldition de liens. Dailleurs, dans certains environnements de programmation, la notion de projet permet de grer la multiplicit des fichiers (source et modules objet) pouvant intervenir dans la cration dun programme excutable.
Massour El Auod ( Langage C )

La compilation spare et ses consquences


Cette notion de projet fait intervenir prcisment les fichiers considrer ; gnralement, il est possible de demander de crer le programme excutable, en ne recompilant que les sources ayant subi une modification depuis leur dernire compilation. les possibilits de compilation spare ont une incidence importante au niveau de la porte des variables globales. Notez que, partir du moment o lon parle de compilation spare, il existe au moins (ou il a exist) deux programmes source ; dans la suite, nous supposerons quils figurent dans des fichiers, de sorte que nous parlerons toujours de fichier source.

Massour El Auod ( Langage C )

19

La compilation spare et ses consquences


A priori, la porte dune variable globale semble limite au fichier source dans lequel elle a t dfinie. Ainsi, supposez que lon compile sparment ces deux fichiers source :

Massour El Auod ( Langage C )

La compilation spare et ses consquences


Il ne semble pas possible, dans les fonctions fct2 et fct3 de faire rfrence la variable globale x dclare dans le premier fichier source (alors quaucun problme ne se poserait si lon runissait ces deux fichiers source en un seul, du moins si lon prenait soin de placer les instructions du second fichier la suite de celles du premier). En fait, le langage C prvoit une dclaration permettant de spcifier quune variable globale a dj t dfinie dans un autre fichier source. Celle-ci se fait laide du mot-cl extern. Ainsi, en faisant prcder notre second fichier source de la dclaration : extern int x ; il devient possible de mentionner la variable globale x (dclare dans le premier fichier source) dans les fonctions fct2 et fct3.
Massour El Auod ( Langage C )

20

La compilation spare et ses consquences


Cette dclaration extern neffectue pas de rservation demplacement de variable. Elle ne fait que prciser que la variable globale x est dfinie par ailleurs et elle en prcise le type. Supposons que nous ayons compil les deux fichiers source prcdents et voyons dun peu plus prs comment lditeur de liens est en mesure de rassembler correctement les deux modules objet ainsi obtenus Dune part, aprs compilation du premier fichier source, on le trouve, dans le module objet correspondant, une indication associant le symbole x et son adresse dans le module objet. Autrement dit, contrairement ce qui se produit pour les variables locales, pour lesquelles ne subsiste aucune trace du nom aprs compilation, le nom des variables globales continue exister au niveau des modules objet.
Massour El Auod ( Langage C )

Dautre part, aprs compilation du second fichier source, on trouve dans le module objet correspondant, une indication mentionnant quune certaine variable de nom x provient de lextrieur et quil faudra en fournir ladresse effective. Ce sera effectivement le rle de lditeur de liens que de retrouver dans le premier module objet ladresse effective de la variable x et de la reporter dans le second module objet.

Massour El Auod ( Langage C )

21

Type, porte et classe dallocation des variables

Massour El Auod ( Langage C )

Transmission des paramtres d'une fonction


Les paramtres d'une fonction sont traits de la mme manire que les variables locales de classe automatique : lors de l'appel de la fonction, les paramtres effectifs sont copis dans le segment de pile. La fonction travaille alors uniquement sur cette copie. Cette copie disparat lors du retour au programme appelant. Cela implique en particulier que, si la fonction modifie la valeur d'un de ses paramtres, seule la copie sera modifie ; la variable du programme appelant, elle, ne sera pas modifie. On dit que les paramtres d'une fonction sont transmis par valeurs.
Massour El Auod ( Langage C )

22

Exemple Transmission par valeur


void echange (int a, int b) { int t; printf("debut fonction :\n a = %d \t b = %d\n",a,b); t = a; a = b; b = t; printf("fin fonction :\n a = %d \t b = %d\n",a,b); return; } main() { int a = 2, b = 5; printf("debut programme principal :\n a = %d \t b = %d\n",a,b); echange(a,b); printf("fin programme principal :\n a = %d \t b = %d\n",a,b); } debut programme principal : a = 2 b = 5
debut fonction : a = 2 b = 5 fin fonction : a = 5 b = 2 fin programme principal : a = 2 b = 5

Massour El Auod ( Langage C )

Transmission des paramtres d'une fonction

Pour qu'une fonction modifie la valeur d'un de ses arguments, il faut qu'elle ait pour paramtre l'adresse de cet objet et non sa valeur.

Massour El Auod ( Langage C )

23

Les tableaux et les pointeurs

Massour El Auod ( Langage C )

Les tableaux et les pointeurs


Comme tous les langages, C permet dutiliser des tableaux. On nomme ainsi un ensemble dlments de mme type dsigns par un identificateur unique ; chaque lment est repr par un indice prcisant sa position au sein de lensemble. Par ailleurs, le langage C dispose de pointeurs, cest-dire de variables destines contenir des adresses dautres objets (variables, fonctions...). A priori, ces deux notions de tableaux et de pointeurs peuvent paratre fort loignes lune de lautre. Toutefois, il se trouve quen C un lien indirect existe entre ces deux notions.
Massour El Auod ( Langage C )

24

Les tableaux
Un tableau est un ensemble fini d'lments de mme type, stocks en mmoire des adresses contigus. La dclaration d'un tableau une dimension se fait de la faon suivante : type nom-du-tableau [nombre-lments]; Exemple: int tab[10]; indique que tab est un tableau de 10 lments de type int. Cette dclaration alloue donc en mmoire pour l'objet tab un espace de 10 4 octets conscutifs.
Exemple

#define N 4 int tab[N] = {1, 2, 3, 4}; main() { int i; for (i = 0; i < N; i++) printf("tab[%d] = %d\n",i,tab[i]); }
Massour El Auod ( Langage C )

Tab[0]=1 Tab[1]=2 Tab[2]=3 Tab[3]=4

Exemple
#define int long int double long double SIZE a[5]; big[100]; d[100]; v[SIZE]; 10 /* /* /* /* a is an array of 5 ints */ big is 400 bytes! */ but d is 800 bytes! */ 10 long doubles, 100 bytes */

int double short long

a[5] d[100] primes[] n[50]

= = = =

{ { { {

10, 20, 30, 40, 50 }; 1.5, 2.7 }; 1, 2, 3, 5, 7, 11, 13 }; 0 };

int int double short

i = 7; a[i]; d[c]; primes[];

Massour El Auod ( Langage C )

25

Les tableaux
Lors d'une initialisation, il est galement possible de ne pas spcifier le nombre d'lments du tableau. Par dfaut, il correspondra au nombre de constantes de la liste d'initialisation Exemple:
char tab[] = "exemple"; main() { int i; printf("Nombre de caracteres du tableau = %d\n",sizeof(tab)/sizeof(char)); tableau =8 Nombre de caracteres du }
Massour El Auod ( Langage C )

char char char char

first_name[5] = { 'J', 'o', 'h', 'n', '\0' }; last_name[6] other[] = "Minor"; = "Tony Blurt";

characters[7] = "No null";

this special case specifically excludes the null terminator


first_name last_name other characters
'J' 'M' 'T' 'N' 'o' 'i' 'o' 'o' 'h' 'n' 'n' 32 'n' 'o' 'y' 'n' 0 'r' 32 'u' 0 'B' 'l' 'l' 'l' 'u' 'r' 't' 0

Massour El Auod ( Langage C )

26

Lors de linitialisation on accde au lements du tableaux via des entiers de 0..size-1

int main(void) { int a[6]; int i = 7; a[0] = 59; a[5] = -10;

a 0 1 2

a[6] = 0; a[-1] = 5; return 0; }

3 4 5

Massour El Auod ( Langage C )

on peut dclarer un tableau plusieurs dimensions. Par exemple, pour un tableau deux dimensions : type nom-du-tableau[nombre-lignes][nombrecolonnes] En fait, un tableau deux dimensions est un tableau unidimensionnel dont chaque lment est lui-mme un tableau. On accde un lment du tableau par l'expression ``tableau[i][j]''. Pour initialiser un tableau plusieurs dimensions la compilation, on utilise une liste dont chaque lment est une liste de constantes
Massour El Auod ( Langage C )

27

Les tableaux 2 dimension


#define M 2 #define N 3 int tab[M][N] = {{1, 2, 3}, {4, 5, 6}}; main() { int i, j; for (i = 0 ; i < M; i++) { for (j = 0; j < N; j++) printf("tab[%d][%d]=%d\n",i,j,tab[i][j]); } }

Massour El Auod ( Langage C )

Une structure est une suite finie d'objets de types diffrents. Contrairement aux tableaux, les diffrents lments d'une structure n'occupent pas ncessairement des zones contigus en mmoire. Chaque lment de la structure, appel membre ou champ, est dsign par un identificateur. struct modele {type-1 membre-1; type-2 membre-2; ... typen membre-n; }; Pour dclarer un objet de type structure correspondant au modle prcdent, on utilise la syntaxe: struct modele objet; ou bien, si le modle n'a pas t dclar au pralable : struct modele {type-1 membre-1; type-2 membre-2; ... typen membre-n; }objet; On accde aux diffrents membres d'une structure grce l'oprateur membre de structure, not ``.''. Le i-me membre de objet est dsign par l'expression : objet.membre-i

Structure

Massour El Auod ( Langage C )

28

Exemple
struct enreg { int numero ; int qte ; float prix ; }; Celle-ci dfinit un modle de structure mais ne rserve pas de variables correspondant cette structure. Ce modle sappelle ici enreg et il prcise le nom et le type de chacun des champs constituant la structure (numero, qte et prix). Une fois un tel modle dfini, nous pouvons dclarer des variables du type correspondant (souvent, nous parlerons de structure pour dsigner une variable dont le type est un modle de structure). Massour El Auod (:Langage C ) Par exemple struct enreg art1 ;

Structure
Bien que ce soit peu recommand, sachez quil est possible de regrouper la dfinition du modle de structure et la dclaration du type des variables dans une seule instruction comme dans cet exemple : struct enreg { int numero ; int qte ; float prix ; } art1, art2 ; Dans ce dernier cas, il est mme possible domettre le nom de modle (enreg), condition, bien sr, que lon nait pas dclarer par la suite dautres variables de ce type.
Massour El Auod ( Langage C )

29

Structure
Il est possible daffecter une structure le contenu dune structure dfinie partir du mme modle. Par exemple, si les structures art1 et art2 ont t dclares suivant le modle enreg dfini prcdemment, nous pourrons crire : art1 = art2 ; Une telle affectation globale remplace avantageusement : art1.numero = art2.numero ; art1.qte = art2.qte ; art1.prix = art2.prix ;

Massour El Auod ( Langage C )

Structure
On retrouve pour les structures les rgles dinitialisation qui sont en vigueur pour tous les types de variables, savoir : En labsence dinitialisation explicite, les structures de classe statique sont, par dfaut, initialises zro ; celles possdant la classe automatique ne sont pas initialises par dfaut (elles contiendront donc des valeurs alatoires) Il est possible dinitialiser explicitement une structure lors de sa dclaration. On ne peut toutefois employer que des constantes ou des expressions constantes et cela aussi bien pour les structures statiques que pour les structures automatiques
Voici un exemple dinitialisation de notre structure art1, au moment de sa dclaration : struct enreg art1 = { 100, 285, 2000 } ; Massour El Auod ( Langage C )

30

Les Unions
Une union dsigne un ensemble de variables de types diffrents susceptibles d'occuper alternativement une mme zone mmoire. Une union permet donc de dfinir un objet comme pouvant tre d'un type au choix parmi un ensemble fini de types. Si les membres d'une union sont de longueurs diffrentes, la place rserve en mmoire pour la reprsenter correspond la taille du membre le plus grand. Les dclarations et les oprations sur les objets de type union sont les mmes que celles sur les objets de type struct. Dans l'exemple suivant, la variable hier de type union jour peut tre soit un entier, soit un caractre

Massour El Auod ( Langage C )

Union structure
Comme la structure, une union est une entit structure pouvant regrouper plusieurs lments de types diffrents sous un mme nom. A linverse dune structure, ses membres nexistent pas simultanment mais sexcluent mutuellement Avantage Seuls et uniques avantage le gain de place la multiple interprtation d une zone mmoire Cela avait son importance lpoque o le C est apparu (mmoire chre) Cela perd de plus en plus El Auod ( Langage C ) Massour de son intrt

31

Exemple dUnion
#include <stdio.h> union jour { char lettre; int numero; }; main() { union jour hier, demain; hier.lettre = 'J'; printf("hier = %c\n",hier.lettre); hier.numero = 4; demain.numero = (hier.numero + 4) ; printf("demain = %d\n",demain.numero); }

hier=J demain=8

Massour El Auod ( Langage C )

Les numrations permettent de dfinir un type par la liste des valeurs qu'il peut prendre. Un objet de type numration est dfini par le mot-clef enum et un identificateur de modle, suivis de la liste des valeurs que peut prendre cet objet : enum modele {constante-1, constante-2,...,constante-n}; Exemple: #include <stdio.h> main() b=1 { enum booleen {faux, vrai}; c=0 enum booleen b, c; b = vrai; c = faux; printf("b = %d\n",b);printf("c = %d\n",c); } En ralit, les objets de type enum sont reprsents comme des int. Les valeurs possibles constante-1, constante-2 ,...,constante-n sont codes par des entiers de 0 n-1. Par exemple, le type enum booleen ( Langage C ) le programme suivant associe dfini dans Massour El Auod l'entier 0 la valeur faux et l'entier 1 la valeur vrai.

Les numrations

32

Pointeur
Toute variable manipule dans un programme est stocke quelque part en mmoire centrale. Cette mmoire est constitue d'octets qui sont identifis de manire univoque par un numro qu'on appelle adresse. Pour retrouver une variable, il suffit donc de connatre l'adresse de l'octet o elle est stocke (ou, s'il s'agit d'une variable qui recouvre plusieurs octets contigus, l'adresse du premier de ces octets).
Massour El Auod ( Langage C )

pointeur
Pour des raisons videntes de lisibilit, on dsigne souvent les variables par des identificateurs, et non par leur adresse. C'est le compilateur qui fait alors le lien entre l'identificateur d'une variable et son adresse en mmoire. Toutefois, il est parfois trs pratique de manipuler directement une variable par son adresse.

Massour El Auod ( Langage C )

33

Notion dadresse
Si v est une variable, &v reprsente ladresse de v. Attention :
&10 nest pas permis &(i+1) non plus

On introduit un nouveau type de variable: le type pointeur, Une variable de type pointeur contient une adresse. Un pointeur pointe toujours vers une zone mmoire contenant un type prcis dinformation (int, char, ...)
Massour El Auod ( Langage C )

Pointeur
Dclaration Pour dclarer un pointeur
type *var; o type est un type quelconque et var est le nom de la variable

Exemples :
int *p; char *pc;

L'adresse d'un objet tant un numro d'octet en mmoire, il s'agit d'un entier quelque soit le type de l'objet considr. Le format interne de cet entier (16 bits, 32 bits ou 64 bits) dpend des architectures. Massour El Auod ( Langage C )

34

Exemple de dclaration
int long int */ float* */ char *pi; *p; /* pi is a pointer to an int */ /* p is a pointer to a long int

pf;

/* pf is a pointer to a float

c, d, *pc;

/* c and d are a char pc is a pointer to char */ /* pd is pointer to a double e and f are double */ /* start is a pointer to a char

double*

pd, e, f;

char* */ char* */

start;

end;

/* end is a pointer to a char

Massour El Auod ( Langage C )

Soit la dclaration
int *p; p reprsente une adresse *p reprsente la valeur contenue cette adresse
char g = 'z'; int main(void) { char c = 'a'; char *p; p = &c; p = &g; return 0; } Massour El Auod ( Langage C ) Langage C

p 0x1132 0x1132 p 0x91A2 0x91A2

c 'a' g 'z'

35

EXEMPLE
main() { int i = 3; int *p; p = &i; printf("*p = %d \n",*p); } *p = 3

Massour El Auod ( Langage C )

#include <stdio.h> char g = 'z';

int main(void) { char c = 'a'; char *p; p = &c; printf("%c\n", *p); p = &g; printf("%c\n", *p); return 0; } Massour El Auod ( Langage C )
a z

36

c 'a' 'b' 0x1132

char c = 'a'; char *p; p = &c; *p = 'b'; printf("%c\n", *p);


b

0x1132

Massour El Auod ( Langage C )

Nous avons naturellement dj rencontr des cas daffectation de la valeur dun pointeur un pointeur de mme type. A priori, cest le seul cas autoris par le langage C (du moins, tant que lon ne procde pas des conversions explicites). Une exception a toutefois lieu en ce qui concerne la valeur entire 0, ainsi que pour le type gnrique void * dont nous parlerons un peu plus loin. Cette tolrance est motive par le besoin de pouvoir reprsenter un pointeur nul, cest--dire ne pointant sur rien (cest le NIL du Pascal). Bien entendu, cela na dintrt que parce quil est possible de comparer nimporte quel pointeur (de nimporte quel type) avec ce pointeur nul .

Massour El Auod ( Langage C )

37

Dune manire gnrale, plutt que la valeur 0, il est conseill demployer la constante NULL prdfinie dans stdio.h, et galement dans stddef.h (bien entendu, elle sera remplace par la constante entire 0 lors du traitement par le prprocesseur, mais les programmes source en seront nanmoins plus lisibles).
#include <stdio.h> int { main(void) short short i = 13; *p = NULL;

if(p == NULL) printf("the pointer is invalid!\n"); else printf("the pointer points to %hi\n", *p); return 0; }

Massour El Auod ( Langage C )

Erreur dinitialisation
Le code suivant contien une erreure
#include <stdio.h>
p i ? 0x1212 13

int {

main(void) short i = 13; short *p; *p = 23; printf("%hi\n", *p); return 0;

short short

i = 13; *p = &i;

Massour El Auod ( Langage C )

38

Attention
Il y a grande diffrence entre :
int int int i = 10, j = 14; *p = &i; *q = &j; p 0x15A0 0x15A0 q *p = *q; 0x15A4 0x15A4 j 14 i 10 14

and:
int int int i = 10, j = 14; *p = &i; *q = &j; p 0x15A0 0x15A4 q 0x15A4 0x15A4 0x15A0 j 14 i 10

p = q;

Massour El Auod ( Langage C )

A remplir
int main(void) { int i = 10, j = 14, k; int *p = &i; int *q = &j; *p += 1; p = &k; *p = *q; p = q; *p = *q; return 0; } Massour El Auod ( Langage C )

i 0x2100 j 0x2104 k 0x1208 p 0x120B q 0x1210

39

Il est galement possible de lire un pointeur via le code (%p) Exemple int v,*ptr; scanf("%p", &ptr); Le format est compatible avec printf : on peut lire ce qui a t crit avec printf.

Massour El Auod ( Langage C )

Il est possible de dclarer un pointeur sans prciser le type dinformation pointe (on utilise void) void *ptr; Dans ce cas, on ne peut pas utiliser *ptr provoque une erreur la compilation.

Massour El Auod ( Langage C )

40

Arithmtique des pointeurs


La valeur d'un pointeur tant un entier, on peut lui appliquer un certain nombre d'oprateurs arithmtiques classiques. Les seules oprations arithmtiques valides sur les pointeurs sont : l'addition d'un entier un pointeur. Le rsultat est un pointeur de mme type que le pointeur de dpart ; la soustraction d'un entier un pointeur. Le rsultat est un pointeur de mme type que le pointeur de dpart ; la diffrence de deux pointeurs pointant tous deux vers des objets de mme type. Le rsultat est un entier. Notons que la somme de deux pointeurs n'est pas autorise.
Massour El Auod ( Langage C )

41