Top Posters
Since Sunday
5
a
5
k
5
c
5
B
5
l
5
C
4
s
4
a
4
t
4
i
4
r
4
A free membership is required to access uploaded content. Login or Register.

Langage C Apprentissage.docx

Uploaded: 6 years ago
Contributor: redsmile
Category: Data Structures
Type: Other
Rating: N/A
Helpful
Unhelpful
Filename:   Langage C Apprentissage.docx (213.43 kB)
Page Count: 164
Credit Cost: 1
Views: 77
Last Download: N/A
Transcript
Apprentissage du langage C G n ralit s La programmation en C c'est comme le sexe chez les adolescents Tout le monde y pense Tout le monde en parle Tout le monde croit que le voisin le fait Presque personne ne le fait Ceux qui le font le font mal Pensent que la prochaine fois ce sera mieux Ne prennent pas de pr cautions N'osent pas avouer leurs lacunes de peur de para tre niais Sont fort bruyants quand ils y arrivent Introduction Historique Le langage C est un langage de programmation con u pour de multiples utilisations Son d veloppement est parall le au syst me UNIX car le noyau du syst me UNIX est crit en langage C D sormais il est utilis sur tous les syst mes d'exploitation et donc sur toutes les machines Les principes fondamentaux du langage C sont issus des langages B et BCPL cr s vers pour le premier syst me UNIX dans les laboratoires AT T par Ken Thompson et Dennis Ritchie En Ken Thompson cr e le langage B inspir du BCPL En Dennis Ritchie d finit le langage C partir des travaux de Ken Thompson Ces travaux seront continu s par Brian W Kernigham et Dennis Ritchie en pour donner naissance au premier ouvrage de r f rence Le langage C ditions MASSON Si le noyau du langage C est assez restreint il s'enrichit d'une librairie standard qui contient des fonctions permettant les traitements les plus divers Entr es-Sorties Fichiers Traitements des cha nes de caract res Gestion dynamique de la m moire etc L' tude du syst me UNIX passe obligatoirement par l' tude du langage C Ult rieurement il sera possible d'aborder l' tude de la POO Programmation Orient e Objet en C Des travaux de normalisation ont t entrepris partir de Le C-ANSI a t approuv fin Norme X - - Dans ce document on s'efforcera d'utiliser la norme ANSI Tous les exemples sauf avertissement seront donn s pour un compilateur UNIX cc ou gcc respectant la norme ANSI Notions de fonctions et de blocs Les unit s de structurations du langage C sont la fonction qui correspond la notion de sous-programme en PASCAL FORTRAN ou ADA Il n'y a pas de distinction entre proc dure qui effectue une action mais qui ne renvoie rien et fonction qui calcule et renvoie un r sultat en fonction de param tres les fichiers comprenants des d clarations de fonctions et d'objets Les fichiers peuvent tre compil s s par ments Ils constituent des modules briques de base dans la construction d'applications Un programme C c'est en fait un ou plusieurs fichiers comprenant des d clarations de fonctions des d clarations d'objets variables ou constantes des instructions de travail des directives pour le pr processeur Contrairement PASCAL ou ADA on ne peut d clarer de fonction l'int rieur d'une autre fonction Une fonction est un module ou sous programme destin e effectuer une op ration l mentaire et une seule en d finissant les cas limites En langage C un programme source est constitu de fonctions dont une particuli re appel e main constitue le point d'entr e et de sortie du programme On doit donc imp rativement trouver main dans un programme et on ne doit en trouver qu'un seul Un bloc est un ensemble d'instructions formant une entit logique indissociable born e par une accolade ouvrante d but et une accolade fermante fin Le plus grand bloc est la fonction mais celle-ci peut contenir d'autres blocs d'instructions Exemple de programme en C fonction Fonction Point d'entr e dans la fonction Variables ventuelles Commentaires ventuels Instructions Point de sortie de la fonction main Fonction principale - Point d'entr e du programme Variables ventuelles Commentaires Instructions Point de sortie du programme fonctionN Fonction N Point d'entr e dans la fonction N Variables ventuelles Commentaires ventuels Instructions Point de sortie de la fonction N Le compilateur C sous Unix L'ensemble d'un ex cutable peut tenir dans plusieurs fichiers sources chacun contenant une ou plusieurs fonctions utilis es par le programme La compilation d'un programme consistera alors transformer chaque source en un module objet et relier ensuite les diff rents modules objet pour produire un ex cutable Objet o Objet o Objet o Biblioth que a Biblioth que a Edition de liens EXECUTABLE Pr -compilation Traduction en assembleur Assemblage Source c Source c Source c Source i Source i Source i Source s Source s Source s Objet o Objet o Objet o Biblioth que a Biblioth que a Edition de liens EXECUTABLE Pr -compilation Traduction en assembleur Assemblage Source c Source c Source c Source i Source i Source i Source s Source s Source s Le passage du fichier source au module objet est g n ralement automatique pour le compilateur sauf si on lui demande express ment de s'arr ter en chemin De plus comme il existe tr s souvent qu'un seul source par ex cutable le compilateur continue g n ralement son travail jusqu' produire l'ex cutable La commande de compilation sous UNIX est cc options liste de fichiers Extension des fichiers c Fichier source i Fichier interpr table par le compilateur s Module assembleur o Fichier objet a Librairie statique sans extension Ex cutable Quelques exemples de la commande cc cc fic c Compilation de fic c L'ex cutable g n r est automatiquement nomm a out cc fic c -o prog Compilation de fic c L'ex cutable g n r est nomm prog cc -O fic c -o fic Compilation optimis e de fic c L'ex cutable g n r est nomm fic cc -c fic c Compilation partielle de fic c La compilation s'arr te au module objet nomm fic o cc -S fic c Compilation partielle de fic c La compilation s'arr te la cr ation d'un source en assembleur nomm fic s cc -P fic c Compilation partielle de fic c La compilation s'arr te la cr ation d'un source fic i directement compilable cc fic c fic c -o prog Compilation des deux sources li s fic c et fic c pour produire un ex cutable prog cc fic o fic o -o prog Compilation des deux modules objets li s fic o et fic o pour produire un ex cutable prog cc fic c libtruc a -o prog Compilation de fic c en le liant la librairie libtruc a pour produire un ex cutable prog cc fic c lm -o prog Compilation de fic c en le liant la librairie math matique usr lib libm a pour produire un ex cutable prog L'option -l qqchose est un raccourci vers usr lib libqqchose a cc -g fic c Compilation de fic c avec insertion automatique d'instructions de d bogage L'ex cutable g n r est automatiquement nomm a out cc fic c -qsrcmsg Compilation de fic c avec affichage de toutes les lignes contenant des erreurs si erreur il y a L'ex cutable g n r est automatiquement nomm a out cc fic c -qxref Compilation de fic c et cr ation d'un listing fic lst qui donne les r f rences crois es quelle fonction appelle quelle autre fonction L'ex cutable g n r est automatiquement nomm a out Remarques la librairie standard usr lib libc a contenant une multitude de fonctions de travail est toujours automatiquement li e lors de la compilation La documentation C sous Unix Chaque fonction du langage est expliqu e dans la documentation int gr e d'Unix commande man En cas de besoin l'acc s est toujours possible Exemple Pour une aide sur la fonction printf man printf El ments de base du langage Les identificateurs Un identificateur permet de nommer une variable une pseudo constante sera vue en fin de cours ou une fonction Ils doivent tre crits selon les r gles suivantes caract res maximum certains syst mes ne tiennent compte que des premiers le premier caract re doit obligatoirement tre soit une lettre soit le caract re soulign mais c'est viter pour la clart du source les autres caract res peuvent tre indiff remment des lettres a-z des chiffres - ou le caract re soulign le signe moins l'espace parfois les caract res accentu s ainsi que tous les caract res non cit s pr c demment sont interdits En r gle g n rale le nom des variables est crit en lettres minuscules avec quelques majuscules pour faire ressortir le but de la variable et celui des pseudo constantes cf chapitre sur le pr processeur totalement en majuscules conventions des programmeurs Le compilateur C fait la diff rence entre majuscules et minuscules Certains identificateurs sont interdits car ils constituent les mots r serv s du langage vu plus loins Autoris s Interdits Raison de l'interdiction i Cpt-Lig Pr sence du caract re moins j a z Pr sence de l'espace CompteurLignes f Commence par un chiffre Compteur Col a Pr sence du caract re dollar Les mots r serv s Certains mots sont r serv s par le langage car ils ont une signification particuli re Il est alors interdit d'utiliser un de ces mots comme identificateur Bien que le compilateur fasse la diff rence entre majuscules et minuscules et qu'on puisse donc utiliser un de ces mots en majuscules comme identificateur il est pr f rable pour la clart du source d' viter cette attitude de programmation Types Classes Instructions Autres char auto break case double const continue default float extern do enum int register else sizeof long static for typedef short volatile goto signed if struct return union switch unsigned while void Les s parateurs Les diff rents s parateurs reconnus par le compilateur peuvent avoir plusieurs significations Type Nom Significations Crochets Indice d'acc s dans un tableau Parenth ses Groupement d'expressions force la priorit Isolement des expressions conditionnelles D claration des param tres d'une fonction Conversion explicite d'un type casting Accolades D but et fin de bloc d'instructions Initialisation la d claration d'un tableau D claration d'une structure Virgule S pare les l ments d'une liste d'arguments Concat nation d'instructions Point virgule Terminateur d'instruction Deux points Label Point Acc de un champ d'une structure - Fl che moins suivi de sup rieur Acc de un champ d'un pointeur sur une structure Les commentaires Les commentaires permettent de porter des remarques afin de faciliter la lecture d'un programme source Chaque commentaire est d limit par les combinaisons suivantes Commentaire Les commentaires ne sont pas pris en compte par le compilateur et n'augmentent donc pas la taille des programmes ex cutables Les commentaires peuvent tenir sur plusieurs lignes du style Je commente mon programme Je continue mes commentaires J'ai fini mes commentaires Les commentaires ne peuvent pas tre imbriqu s comme dans le style D but Commentaire Commentaire Fin commentaire Remarque Depuis l'av nement du C les compilateurs acceptent maintenant comme commentaire la s quence sp cifique ce langage qui permet de ne commenter qu'une ligne ou une partie de la ligne Cette ligne est totalement mise en commentaire int i Le commentaire ne commence qu' partie de la s quence Les variables Comme tout langage d claratif le langage C exige que les variables soient d clar es avant leur utilisation En fait pour chaque bloc d'instructions d limit par des accolades il faut d clarer toutes les variables avant que soit crite la premi re instruction du bloc Mais cette r gle tant valable pour chaque bloc on peut aussi d clarer des variables dans des sous-bloc d'instructions Exemple Bloc d'instruction n D claration des variables avant toute instruction du bloc n Instruction Instruction Sous-bloc d'instruction n D claration des variables avant toute instruction du bloc n Instruction Instruction Instruction appartenant au bloc n Une variable est d finie par plusieurs attributs certains facultatifs mais ayants alors une valeur par d faut sa classe d'allocation en m moire auto par d faut en cas de variable num rique l'indication sign ou nonsign sign par d faut le type de la valeur qu'elle doit stocker entier par d faut nombre en virgule flottante etc son nom l'identificateur de la variable D claration classe unsigned signed type identificateur n'oubliez pas le point-virgule final Exemple static int nb D claration d'une variable nb de type int de classe static int i D claration d'une variable i de type int de classe auto par d faut Remarque la notion de classe sera revue plus en d tail par la suite du cours Jusque l il suffira de ne pas sp cifier de classe pour vos variables Lors de sa cr ation en m moire une variable poss de n'importe quelle valeur Il convient donc de ne jamais pr sumer de la valeur d'une variable non-initialis e l ments de base pour d buter Les types de base Les types de base correspondent aux types directement support s par la machine Dans le langage C tout type de base est un nombre cod sur un ou plusieurs octets Donc tout type de base accepte toute op ration math matique de base Les entiers int entier cod sur ou octets suivant la machine sur laquelle on travaille Dans le monde Unix il est g n ralement de octets Sa plage de valeur peut donc aller de - c'est dire de s'il est d clar sign c'est dire de s'il est d clar non-sign short int entier court cod sur octets Le mot short est suffisant par luim me donc le mot int n'est pas obligatoire Sa plage de valeur peut aller de - c'est dire de s'il est d clar sign c'est dire de s'il est d clar non-sign long int entier long cod sur octets Le mot long est suffisant par luim me donc le mot int n'est pas obligatoire Sa plage de valeur peut aller de - c'est dire de s'il est d clar sign c'est dire de s'il est d clar non-sign long long int entier long cod sur octets Les mots long long sont suffisants par euxm mes donc le mot int n'est pas obligatoire Sa plage de valeur peut aller de - c'est dire de s'il est d clar sign c'est dire de s'il est d clar non-sign char caract re ASCII qui est un nombre entier cod sur octet Lui aussi de par sa nature num rique accepte des op rations math matiques Sa plage de valeur peut aller de - c'est dire de s'il est d clar sign c'est dire de s'il est d clar non-sign Remarques Ajouter une variable ayant atteint sa limite maximale la fait basculer en limite minimale perte de la retenue C'est dire que - si on travaille sur une variable de type char sign Il est possible de forcer un entier tre sign ou non-sign en rajoutant le mot clef signed ou unsigned avant son type char int short int long int Dans le monde Unix une variable est sign e par d faut donc le mot clef signed est inutile Les r els Ils respectent les r gles de codage IBM des r els utilisant un bit pour le signe x bits pour la mantisse et y pour l'exposant Ils sont de deux types standard et un troisi me nonstandard float r el en virgule flottante cod sur octets Sa plage de valeur est de - x - - x double r el en virgule flottante cod sur octets Sa plage de valeur est de - x - - x long double R el en virgule flottante cod sur octets Sa plage de valeur est de - x - - x Mais ne faisant pas partie de la norme ANSI il est souvent transform en double par les compilateurs normalis s Les bool ens Il n'existe pas en langage C de type bool en Mais la valeur z ro est consid r e par le langage Comme faux et toute autre valeur diff rente de z ro est consid r e comme vrai Les constantes Les constantes permettent de symboliser les valeurs num riques et alphab tiques de la programmation courante Il peut para tre trivial d'en parler tellement on y est habitu mais cela est utile en langage C car il existe plusieurs formats de notation constantes num riques en base on les note de la m me fa on que dans la vie courante Ex cinq - moins douze dix-sept - moins quarante cinq etc constantes num riques en base on les note en les faisant toutes commencer par le chiffre Ex cinq - moins dix quinze - moins trente-sept etc constantes num riques en base on les note en les faisant toutes commencer par les caract res x ou X Ex x cinq - x moins dix-huit x vingt-trois - x moins soixante-neuf etc Remarque il est possible de demander explicitement le codage des constantes pr c demment cit es sur un format long en les faisant suivre de la lettre l ou L Ex L nombre cinq cod sur octets constantes ascii on les notes en les encadrant du caract re ' guillemet simple ou accent aigu Comme il s'agit d'un code ascii le langage les remplacera par leur valeur prise dans la table des codes ascii Ex 'a' quatre-vingt dix sept 'A' soixante-cinq ' ' cinquante-trois etc constantes code ascii permettent de coder une valeur ascii ne correspondant aucun caract re imprimable On utilise alors un backslash suivi de la valeur ascii convertie en base sur trois chiffres en compl tant avec des z ros si c'est n cessaire ou bien la valeur ascii convertie en base et pr c d du caract re x le tout encadr des caract res ' guillemet simple ou accent aigu Ex ' ' quatre-vingt dix sept code ascii de a ' x ' cinquante-trois code ascii de etc constantes en virgule flottante notation anglo-saxonne un nombre avec un point s parant la partie enti re de la partie fractionnelle Ex notation scientifique un nombre avec un e ou un E indiquant l'exposant du facteur Ex e x Remarque toutes les constantes en virgule flottantes sont cod es en format double Il est cependant possible de demander explicitement le codage de ces constantes sur un format float en les faisant suivre de la lettre f ou F Ex F nombre cod sur octets constantes pr d finies il s'agit de constantes pr d finies par le compilateur et ayant une fonction sp ciale On utilise la constante telle qu'elle encadr e des caract res ' guillemet simple ou accent aigu Constante Signification Valeur n Fin de ligne t Tabulation horizontale v Tabulation verticale b Retour arri re r Retour chariot f Saut de page a Signal sonore Anti slash Guillemet ' Apostrophe Remarque Comme le langage ram ne toutes ces constantes vers un codage binaire unique et commun il est possible de les m langer loisir 'A' x 'B' Les instructions Le corps d'un programme est compos d'instructions Ces instructions peuvent tre de deux types les instructions simples les instructions compos es Les instructions simples sont termin es par un point virgule On peut les crire sur plusieurs lignes en inhibant la fin de ligne par un anti slash d conseill Elles correspondent des ordres donn s au langage d clarations de variables utilisations de variables appels de fonctions Exemple int a Instruction simple pour d clarer a int b Instruction simple pour d clarer b int c Instruction simple pour d clarer c c a b Instruction simple pour utiliser a b et c printf Instruction simple pour appeler la fonction printf Les instructions compos es sont des s quences d'instructions simples encadr es par des accolades Il s'agit en fait de la notion de bloc Exemple D but du bloc d'instructions int a Instruction simple du bloc int b Instruction simple du bloc int c Instruction simple du bloc c a b Instruction simple du bloc printf Instruction simple du bloc Fin du bloc d'instructions Les op rateurs Les op rateurs permettent de manipuler les variables et les constantes Ils sont de trois type op rateurs unaires ils prennent en compte un seul l ment op rateurs binaires ils prennent en compte deux l ments op rateurs ternaires ils prennent en compte trois l ments Op rateurs binaires Ce sont les plus simples appr hender Les premiers peuvent s'appliquer tout type de variable ou constante enti re ou virgule flottante Egal Affectation d'une valeur une variable Ex a Plus Addition de deux valeurs Ex Moins - Soustraction de deux valeurs Ex Multipli Multiplication de deux valeurs Ex Divis Division de deux valeurs Ex Test d' galit Permet de v rifier l' galit entre deux valeurs Ex a b si a est gal b alors l'expression vaudra une valeur quelconque diff rente de symbolisant le bool en vrai sinon l'expression vaudra Attention Ecrire en pensant peut produire des incoh rences graves dans le programme qui se compilera cependant sans erreur Test de diff rence Permet de v rifier l'in galit entre deux valeurs Ex a b si a est diff rent de b alors l'expression vaudra une valeur quelconque diff rente de symbolisant le bool en vrai sinon l'expression vaudra Cet op rateur est l'oppos du Tests d'in galit s diverses Permet de v rifier les grandeurs relatives entre deux valeurs Ex a b si a est sup rieur ou gal b alors l'expression vaudra une valeur quelconque diff rente de symbolisant le bool en vrai sinon l'expression vaudra Les autres ne peuvent s'appliquer qu'aux valeurs variables ou constantes de type enti re char short long int Modulo Reste d'une division enti re entre deux valeurs Ex ET logique Op ration bool enne ET entre deux bool ens Ex a b si a est vrai ET b est vrai alors l'expression vaudra une valeur quelconque diff rente de symbolisant le bool en vrai sinon l'expression vaudra OU logique Op ration bool enne OU entre deux bool ens Ex a b si a est vrai de OU b est vrai alors l'expression vaudra une valeur quelconque diff rente de symbolisant le bool en vrai sinon l'expression vaudra Les suivants ne peuvent s'appliquer qu'aux valeurs variables ou constantes de type enti re char short long int et agiront individuellement sur chaque bit de la constante ou variable ET bit bit Op ration bool enne ET appliqu e pour chaque bit des deux valeurs le ni me bit de la premi re valeur tant compar au ni me bit de la seconde valeur Ex a Cette expression vaudra si le premier et troisi me bits de a sont masque OU bit bit Op ration bool enne OU appliqu e pour chaque bit des deux valeurs le ni me bit de la premi re valeur tant compar au ni me bit de la seconde valeur Ex a Cette expression donnera une valeur o les premier et troisi me bits seront toujours OU EXCLUSIF bit bit Op ration bool enne OU EXCLUSIF appliqu e pour chaque bit des deux valeurs le ni me bit de la premi re valeur tant compar au ni me bit de la seconde valeur Ex a Cet expression donnera une valeur o les premier et troisi me bits seront l'inverse de ceux de a bascule D calage droite Chaque bit de la valeur sera d cal vers la droite de x positions Ex Cela donne le m me r sultat que de diviser par D calage gauche Chaque bit d'une valeur sera d cal vers la gauche de x positions Ex Cela donne le m me r sultat que de multiplier par Op rateurs d'op ration avec affectation Chaque op rateur binaire pr c demment d crit peut tre associ l'op rateur d'affectation Cela permet de raccourcir une expression du style a a x par l'expression a x sans espace entre le et le Op rateurs unaires Une fois que l'on a compris les op rateurs binaires les op rateurs unaires viennent plus facilement Les premiers peuvent s'appliquer tout type de variable ou constante enti re ou virgule flottante Moins unaire - Fait passer en n gatif un nombre positif et inversement Ex - Plus unaire Juste pour assurer la coh rence avec la vie r elle Ex N gation logique Inverse les bool ens vrai et faux Ex Taille de sizeof Renvoie la taille en octet de la valeur ou du type demand Ex sizeof char Le suivant ne peut s'appliquer qu'aux valeurs variables ou constantes de type enti re char short long int et agira individuellement sur chaque bit de la constante ou variable NOT bit bit Op ration bool enne NOT appliqu e chaque bit de la valeur Ex a Cet expression donnera une valeur o tous les bits seront l'inverse de ceux de a Les quatre derniers ne s'appliquent qu'aux variables de type enti re char short long int Pour chaque exemple nous prendrons une variable i initialement affect e avec Pr -incr mentation plac avant la variable Ex i i commence par s'incr menter et passe Ensuite l'expression renvoie la valeur finale de i soit Post-incr mentation plac apr s la variable Ex i l'expression renvoie d'abord la valeur initiale de i soit Ensuite i s'incr mente et passe Pr -d cr mentation -- plac avant la variable Ex --i i se commence par se d cr menter et passe Ensuite l'expression renvoie la valeur finale de i soit Post-d cr mentation -- plac apr s la variable Ex i-- l'expression renvoie d'abord la valeur initiale de i soit Ensuite i se d cr mente et passe Op rateurs ternaire Il n'y en a qu'un seul qui peut s'appliquer tout type de valeur vrai alors sinon Ex x y z si x est diff rent de donc vrai alors l'expression compl te vaut y sinon elle vaut z Valeur et renvoi d'instruction Toute instruction renvoie une valeur Exemple l'instruction renvoie une valeur qui est Il est possible pour ne pas la perdre de r cup rer cette valeur par l'op rateur d'affectation dans l'instruction a Mais cette derni re instruction renvoie aussi une valeur qui est Il est alors encore possible de la r cup rer par un nouvel op rateur d'affectation dans l'instruction b a etc Il est ainsi possible de r cup rer la valeur de chaque instruction crite Ex a b r cup re dans a le bool en vrai ou faux r sultant de la comparaison entre b et Op rateur de concat nation Celui-ci ne s'applique qu'aux instructions Concat nation d'instruction Permet de mettre plusieurs instructions suivre et de ne prendre que la valeur de la derni re Ex int a b c d clare trois variables a b et c de type int et affecte c Exercices Calculez les r sultats des expressions suivantes R ponse puis R ponse puis R ponse x x R ponse donc R ponse faux R ponse et ne sont pas trait s L'ensemble complet des op rateurs avec leurs priorit s est mis en annexe L'affichage La saisie L'affichage d'une valeur variable ou constante se fait en utilisant la fonction printf qui signifie print formating Cette fonction s'utilise de la mani re suivante Premier argument et le plus complexe Message afficher Ce message encadr par des double guillemets constitue en fait tout le texte que le programmeur d sire afficher A chaque position du texte o il d sire que soit report une variable ou une valeur d'expression il doit l'indiquer en positionnant un signe pour cent suivi d'un caract re indiquant la mani re dont il d sire afficher ladite valeur Autres arguments Expressions et variables dont on d sire afficher la valeur Exemple main int a int b printf Le r sultat de d ajout d plus est d a b a b La saisie d'une variable se fait en utilisant la fonction scanf qui signifie scan formating Cette fonction s'utilise de la mani re suivante Premier argument et le plus complexe Masque de saisie Ce masque encadr par des double guillemets constitue en fait tout ce que devra taper l'utilisateur quand il saisira ses variables A chaque position du texte o le programmeur d sire que soit report une variable saisir il doit l'indiquer en positionnant un caract re pour cent suivi d'un caract re indiquant la mani re dont il d sire que soit saisie ladite valeur Bien souvent il n'y a aucun masque de saisie car c'est tr s contraignant Autres arguments Variables saisir chacune pr c d e du caract re Exemple main int jj int mm int aa printf Saisissez une date sous la forme jj mm aa n scanf d d d jj mm aa Erreur fr quente main int i scanf Saisissez un nombre d i Erreur scanf n'affiche rien Une invite s'affiche avec printf Il faut crire printf Saisissez un nombre n scanf d i L'ensemble des options de saisie et d'affichage sont mises en annexe La conversion de type casting G n ralit s Lorsque le langage doit faire un calcul avec des valeurs num riques ce calcul se fait dans la plus grande pr cision des nombres intervenants et non dans la pr cision du r sultat attendu Exemple float f R sultat f vaut alors qu'il tait s rement attendu Mais et tant une criture typique de nombres au format int le calcul a t enti rement fait en codage int Pour obtenir le bon r sultat il aurait fallu crire aumoins une des deux constante dans une notation en virgule flottante en crivant par exemple float f ou bien float f e Conversions de type explicites Le probl me pr c dent reste le m me si on op re avec des variables de type int pour mettre le r sultat dans un float Le r sultat r cup r dans le float ne correspondra pas la valeur attendue Exemple int a b float f a b La seule fa on d'avoir un r sultat dans f correct est de forcer au moins une des deux variables tre consid r e comme un float Cette op ration se nomme casting du verbe anglais to cast qui signifie jouer un r le On cr e un casting sur une variable en indiquant avant la variable et entre parenth ses dans quel type elle doit tre consid r e Exemple int a int b float f f float a b Le calcul est effectu en consid rant a comme un float f a float b Le calcul est effectu en consid rant b comme un float f float a float b Les deux variables a et b sont consid r es comme des float Dans ces trois critures on aura bien f Conversions de type implicites Les conversions de type implicites se font de fa on naturelle chaque fois que des variables de types diff rents sont utilis es dans une op ration A ce moment l la variable de type le plus troit est convertie dans la variable de type le plus large et le cast n'est pas n cessaire int a float b double f a b Conversion implicite de a en float On peut aussi copier une variables d'un type dans une variable d'un autre type Mais si la variable r ceptrice est plus troite il y a perte de donn es Conversion automatique sans perte de pr cision et sans perte de signe char int le caract re est plac dans l'octet le moins significatif short long expansion du signe int float pas de probl me float double pas de probl me Conversions automatiques avec perte de pr cision int char perte des octets les plus significatifs long short perte des octets les plus significatifs float int perte de la partie d cimale double float perte de pr cision Les types d riv s Les tableaux Chaque type vu pr c demment peut tre d clar sous forme de tableau en faisant suivre le nom de la variable de crochets et en indiquant entre les crochets le nombre d' l ments du tableau On aura alors en m moire plusieurs zones contigu s r serv es pour le tableau et chaque zone aura la taille d'un l ment du tableau La contigu t des zones sera importante lorsqu'on parlera des pointeurs L'initialisation peut se faire lors de la d claration en indiquant les valeurs mises entre accolades et en s parant chaque valeur par le caract re virgule Les tableaux peuvent tre sur plusieurs dimensions en mettant plusieurs s ries de crochets d'affil es Si on initialise un tableau lors de sa d claration on peut omettre la taille de sa premi re dimension le compilateur remplira de lui-m me le vide en fonction des valeurs qu'il doit initialiser Exemple main int i Tableau de entiers double d Tableau de doubles char voyelle 'a' 'e' 'i' 'o' 'u' 'y' Tableau de caract res implicite char semaine Tableau de lignes sur colonnes 'l' 'u' 'n' 'd' 'i' La taille de la premi re dimension 'm' 'a' 'r' 'd' 'i' est facultative On aurait pu mettre 'm' 'e' 'r' 'c' 'r' 'e' 'd' 'i' aussi char semaine 'j' 'e' 'u' 'd' 'i' 'v' 'e' n' 'd' 'r' 'e' 'd' 'i' 's' 'a' m' 'e' 'd' 'i' 'd' 'i' 'm' 'a' 'n' 'c' 'h' 'e' Fin du tableau plus lisible ainsi L'acc s un l ment du tableau se fait en donnant le nom du tableau suivi de l'indice voulu entre crochets Cet indice peut lui-m me tre une variable ou une expression Attention en C un tableau commence l'indice De plus il n'est fait aucun contr le sur la coh rence de l'indice contr le de d passement par exemple C'est au programmeur de v rifier la bonne validit de l'indice par rapport la taille du tableau Exemple suite int j i - i Autoris par le compilateur malgr l'indice incoh rent printf la premi re voyelle est c la quatri me voyelle est c n voyelle voyelle j printf la premi re lettre du dernier jour de la semaine est c n semaine Un tableau n' tant pas un type de base du langage il ne peut pas tre manipul copi ou compar comme une variable simple En particulier la syntaxe tab n'est autoris e que lors de la d claration du tableau Si on d sire le remplir en dehors de sa d claration il faut alors travailler dans le tableau l ment par l ment avec une boucle Exercice Ecrire un programme qui fasse saisir un tableau de nombres virgule flottante Ensuite il les affiche main D claration des variables float tab Tableau des nombres saisir Saisie printf Saisissez le premier nombre scanf f tab printf Saisissez le second nombre scanf f tab printf Saisissez le troisi me nombre scanf f tab printf Saisissez le quatri me nombre scanf f tab printf Saisissez le cinqui me nombre scanf f tab Affichage printf le premier nombre saisi est f not aussi e n tab tab printf le second nombre saisi est f not aussi e n tab tab printf le troisi me nombre saisi est f not aussi e n tab tab printf le quatri me nombre saisi est f not aussi e n tab tab printf le cinqui me nombre saisi est f not aussi e n tab tab Evidemment cela aurait t plus simple avec une boucle Les cha nes de caract res Une cha ne de caract re n'existe pas en C C'est dire que le langage ne conna t pas le type cha ne Les programmeurs ont alors adopt la convention suivante une cha ne de caract res sera repr sent e par un tableau de caract res chaque lettre de la cha ne occupant un caract re du tableau termin par un caract re de valeur rappelons qu'un caract re n'est qu'un nombre entier cod sur bits et donc pouvant prendre une valeur comprise entre et ou entre et Bien souvent cette valeur sentinelle terminant une cha ne est not e dans le format constante code ascii ' ' Il en r sulte les corollaires suivants tout tableau de caract res contenant un caract re ' ' pourra tre trait comme une cha ne de caract res par les fonctions de manipulation de cha nes toute fonction de cr ation ou de remplissage de cha nes rajoutera toujours un caract re ' ' en fin de tableau Evidemment il appartient au programmeur qui va cr er un tableau destin stocker une cha ne de pr voir un emplacement suppl mentaire pour stocker la valeur Exemple char jour 'l' 'u' 'n' 'd' 'i' ' ' Cette notation tant lourde le compilateur autorise d' crire la cha ne d'un seul bloc entre doubles quottes sans crire le final Mais il ne faut pas oublier que ce n'est qu'une autre fa on d' crire et que m me si on ne l' crit plus le final reste pr sent donc on doit en tenir compte dans la place r serv e au tableau Exemple char jour lundi Ce tableau contient lettres plus la valeur Attention aux erreurs de programmation suivantes Si un caract re ' ' vient se mettre au milieu d'une cha ne de caract res cette derni re sera consid r e ensuite comme tronqu e car toutes les fonctions de manipulation de cha nes s'arr teront au premier ' ' rencontr Si le caract re ' ' dispara t du tableau de caract res les fonctions de manipulation de cha nes ne pourront plus rep rer la fin de cha ne et risquent de boucler ind finiment dans leur traitement La fonction printf offre au programmeur la possibilit d'afficher une cha ne d'un seul coup sans avoir programmer de boucle car celle-ci a t programm e dans la fonction Il suffit de mettre l'option s et de ne donner que le nom du tableau sans crochet La fonction scanf offre au programmeur la possibilit de saisir une cha ne d'un seul coup sans avoir programmer de boucle car celle-ci a t programm e dans la fonction Il suffit de mettre l'option s et de ne donner que le nom du tableau sans crochet ni caract re Exemple scanf s jour printf Le jour saisi est s n jour Comparer deux tableaux ne peut se faire qu'en comparant chaque l ment des deux tableaux avec une boucle N' crivez donc pas if jour lundi car cette instruction est possible mais elle ne fait que comparer les adresses m moires des deux tableaux cf chapitre sur les pointeurs La cr ation de nouveau type Il est possible en C de cr er un nouveau type partir d'un type existant en utilisant l'instruction typedef typedef type existant nouveau type Ceci offre en fait une souplesse en ce qui concerne la maintenance Imaginons qu'un programme travaille sur un tableau de moins de l ments Tous les indices du tableau peuvent tre d finis comme des unsigned char puisque ce format permet de coder les nombres entiers jusqu' Mais si le tableau change de taille et d passe l ments il faudra reprendre tout le programme et modifier les types de tous les indices En utilisant l'instruction typedef il est possible de cr er un alias sur le type unsigned char et de d finir tous les indices sur cet alias Si le tableau change de taille il suffit de changer l'alias Exemple tableau l ments typedef unsigned char t indice main D claration des variables float tableau t indice i Balayage du tableau for i i i tab i Exemple tableau l ments typedef unsigned short t indice main D claration des variables float tableau t indice i Balayage du tableau for i i i tab i Les instructions de contr les Une instruction de contr le est une instruction qui permet de rompre l'ex cution s quentielle du programme en fonction de diff rents crit res L'instruction if else Cette instruction permet une ex cution conditionnelle d'une partie du code Syntaxe if X Attention pas de point-virgule Y else Facultatif Z T Si l'instruction X est vrai c'est dire si elle renvoie une valeur diff rente de alors le langage ira ex cuter l'instruction Y Sinon et condition qu'il y ait une instruction else le langage ira ex cuter l'instruction Z Dans tous les cas le langage ira ex cuter l'instruction T La premi re remarque que l'on peut faire est qu'une structure if ne permet qu'une seule instruction pour chaque cas vrai ou faux Mais rien n'emp che que cette instruction soit complexe donc un bloc if X Remarquez le d but de bloc Y Y Y Ici on a la fin du bloc else Remarquez aussi le d but de bloc Z Z Z Ici on a encore la fin du bloc T La seconde remarque est le contenu des parenth ses Il faut que cette instruction renvoie une valeur Or toute instruction renvoie une valeur Par exemple l'instruction renvoie la valeur qui peut tre r cup r e dans une variable a dans la syntaxe a Ainsi toute instruction peut tre test e par un if if Idiot car toujours vrai printf if Idiot car toujours faux printf Jamais ex cut if var Affecte var et renvoie donc vrai printf Peut- tre que le programmeur pensait si var est gal Auquel cas il aurait fallu crire if var avec deux signes coll s if var Si var est vrai donc diff rent de printf L'instruction while Cette instruction permet une ex cution un certain nombre de fois boucle tant que Syntaxe while X Attention pas de point-virgule Y Z Tant que l'instruction X est vrai c'est dire tant qu'elle renvoie une valeur diff rente de alors le langage ex cutera l'instruction Y D s que la l'instruction X devient fausse le langage sort de la boucle et passe l'instruction Z M me remarque pour le if la structure while ne permet de boucler que sur une seule instruction Mais ici aussi rien n'emp che que cette instruction soit un bloc entre accolades while X Remarquez le d but de bloc Y Y etc Ici on a la fin du bloc Z Il en va de m me pour l'instruction entre parenth ses C'est la valeur r siduelle de l'instruction qui est valu e while Toujours vrai donc boucle infinie printf while Toujours faux donc pas de boucle utilit printf Jamais ex cut e while var Affecte var et renvoie donc vrai printf Probablement crit cela en pensant tant que var est gal Alors il faut crire while var Cette erreur est tr s fr quente chez les d butants while var Tant que var est vrai donc diff rent de printf L'instruction do while Cette instruction permet une ex cution un certain nombre de fois boucle tant que mais l' valuation de la condition de boucle se faisant en fin de boucle celle-ci est au moins ex cut e une fois Syntaxe do Attention pas de point-virgule X Ex cut au-moins une fois while Y Attention il faut un point-virgule Z Le langage ex cute l'instruction X puis remonte en d but de boucle tant que l'instruction Y est vrai D s que la l'instruction Y devient fausse le langage sort de la boucle et passe l'instruction Z M me remarque pour le if et le while pr c dent la structure while ne permet de boucler que sur une seule instruction Mais ici aussi rien n'emp che que cette instruction soit un bloc entre accolades do Remarquez le d but de bloc X X etc while Y Ici on a la fin du bloc Z Il en va de m me pour l'instruction entre parenth ses C'est la valeur r siduelle de l'instruction qui est valu e do printf while Toujours vrai donc boucle infinie do printf Ex cut une fois while Toujours faux donc pas de boucle utilit do printf while var Toujours la m me erreur Ecrire en pensant do printf while var Tant que var est vrai donc diff rent de L'instruction for Cette instruction permet de rassembler dans une seule ligne une initialisation une condition de continuation de boucle et un incr ment Syntaxe for X Y Z Attention des points-virgule entre chaque instruction mais pas en fin de for T Q Le langage ira ex cuter l'instruction X avant la boucle Celle-ci est souvent une initialisation de variable Ensuite tant que l'instruction Y est vrai c'est dire tant qu'elle renvoie une valeur diff rente de alors le langage ex cutera l'instruction T En g n ral l'instruction Y contr le la valeur de la variable Enfin il ex cute l'instruction Z qui est souvent un incr ment de la variable D s que la l'instruction Y devient fausse le langage sort de la boucle et saute l'instruction Z pour passer directement l'instruction Q M me remarque pour les autres structures la structure for ne permet de boucler que sur une seule instruction qui peut tre un bloc entre accolades Par ailleurs on peut toujours remplacer un for par un while Exemple avec for for X Y Z Remarquez le d but de bloc T T etc Ici on a la fin du bloc Q Remplacement par un while X while Y Remarquez quand-m me le d but de bloc T T etc Z Ici on a la fin du bloc Q Exemples Incr ment simple for i i i printf d n i Incr ment double remarquez l'utilisation judicieuse de la virgule dans le for for i j i i j printf d d n i j Erreur fr quente dans la programmation d'une boucle for for i i i L'erreur est de penser jusqu' i gal alors que le langage lit tant que i gal printf d n i La syntaxe for i i i n'est pas non plus correcte Les instructions break et continue L'instruction break permet au langage d'interrompre une boucle sans retourner valuer sa condition Dans le cas d'une boucle for l'instruction break fait aussi viter la troisi me instruction de la parenth se instruction Z L'instruction continue permet au langage de remonter l' valuation de la condition de boucle Bien entendu si cette condition n'est plus remplie le langage sort de la boucle Ces deux instructions sont contraires la philosophie de programmation structur e mais elles vitent beaucoup de lourdeurs d' critures Exemple sans break Boucle de i while i if probl me quelconque printf Probl me n i else printf d n i i Exemple avec break Boucle de i while i if probl me quelconque printf Probl me n break printf d n i i Exemple sans continue Boucle de i while i if probl me quelconque printf Probl me n else printf d n i i Exemple avec continue Boucle de i while i if probl me quelconque printf Probl me n continue printf d n i i L'instruction goto Cette instruction permet de se positionner n'importe o dans le source et de continuer l'ex cution partir du nouveau positionnement Elle est toutefois assez d cri e par une grande partie des programmeurs qui respectent le langage et sa philosophie Cependant une utilisation fine et r fl chie permet parfois la simplification d'un code sinon trop lourd comme une gestion d'erreurs par exemple Syntaxe etiquette Remarquez le caract re double-point for X if Y etc goto etiquette Pour se placer sur l' tiquette L'instruction switch case Cette instruction permet un branchement sur cas multiples Syntaxe switch X Attention pas de point-virgule Attention une accolade d but de bloc obligatoire case constante Y Z break case constante P Q break etc default R S Fin du bloc Le langage value l'instruction X Selon sa valeur il se positionne sur la constante qui lui correspond et ex cute les instructions qui s'y trouvent Sinon il se positionne dans le cas default qui est facultatif et qui correspond aux cas non pr vus Le terme constante signifie qu'il est impossible d'y mettre une variable Le programmeur d sirant utiliser un algorithme de ce type devra alors passer par des instructions if else Remarque Le compilateur transforme litt ralement une instruction switch en suite d'instructions goto remarquez le caract re double point terminant chaque constante lui donnant ainsi le r le d'une tiquette Cela implique qu'une fois positionn sur l' tiquette correspondante le programme d roule et ex cute ensuite lin airement toutes les instructions suivantes y compris les instructions correspondantes d'autres cas Cette attitude peut tre heureusement inhib e par l'emploi judicieux de l'instruction break la fin de chaque cas inutile malgr tout pour le cas default Exemple main int nb printf Saisissez un nombre scanf d nb switch nb case Sera ex cut si nb vaut printf Valeur z ro n case case case case Sera ex cut si nb vaut et aussi car il n'y a pas de break au cas printf Nombre d pair inf rieur n nb break case case case case case Sera ex cut si nb vaut printf Nombre d impair inf rieur n nb break default printf Nombre d trop grand pour tre valu n nb L'instruction exit Cette instruction permet d'arr ter et quitter volontairement le programme en dehors de sa fin naturelle fin de la fonction main Syntaxe exit n La valeur n correspond une valeur num rique qui sera r cup r e par le processus ayant lan le programme Si ce programme a t lanc depuis un shell d'Unix cette valeur est renvoy e dans la variable shell Par convention une valeur indique que le programme s'est d roul normalement et une valeur diff rente de indique que la sortie est due une exception erreur Bien que cette instruction puisse tre appel e de n'importe quelle fonction la philosophie du langage veut que seule la fonction main utilise l'instruction exit Exercices Ecrire un programme qui fasse saisir un tableau de nombres virgule flottante Ensuite il les affiche Enfin il recherche et affiche les l ments du tableau de valeur comprise entre - et main D claration des variables unsigned short i Indice de boucle dans le tableau float tab Tableau des nombres saisir Saisie for i i i Le premier indice est printf Saisissez le nombre hu i i pour faire correspondre l'indice affich avec la vision humaine scanf f tab i Affichage des valeurs du tableau for i i i printf L' l ment hu est f n i tab i Recherche et affichage des valeurs correspondantes aux crit res for i i i if tab i - tab i printf L' l ment hu de valeur f correspond aux crit res n i tab i M me recherche mais en utilisant la condition inverse juste pour le fun for i i i if tab i - tab i Remarquez que le ET est devenu un OU loi de De Morgan continue On va directement sur i Ici on est certain que l' l ment du tableau correspond aux crit res printf L' l ment hu de valeur f correspond aux crit res n i tab i Ecrire un programme qui affiche XXXXXXXXXX YXXXXXXXXX YYXXXXXXXX YYYXXXXXXX YYYYXXXXXX YYYYYXXXXX YYYYYYXXXX YYYYYYYXXX YYYYYYYYXX YYYYYYYYYX YYYYYYYYYY Remarque Si on num rote chaque ligne en commen ant par alors la ligne n il y a n Y et n X main D claration des variables unsigned short lig Indice de ligne unsigned short i Indice de boucle Boucle sur lignes for lig lig lig La premi re ligne est Boucle sur le nombre de Y for i i lig i Affichage des Y printf Y Boucle sur le nombre de X for i - lig i i-- Affichage des X printf X On peut mettre plus simplement for i i lig i mais l'op ration lig est alors ex cut e chaque boucle ce qui les ralentit Fin de ligne printf n Ecrire un programme qui affiche etc Remarque Si on num rote chaque ligne en commen ant par alors la ligne n contient n valeurs et s'arr te n main D claration des variables unsigned short lig Indice de ligne unsigned short i Indice de boucle Initialisation de la ligne lig Boucle infinie while Boucle sur le nombre de valeurs afficher for i i lig i Affichage des valeurs printf d i Fin de ligne Incr ment num ro de ligne printf n lig Les fonctions Une fonction est un sous-programme qui re oit ventuellement des arguments en entr e ces arguments sont toujours des valeurs num riques et qui retourne ventuellement une valeur d'un certain type vers la fonction appelante L' criture d'une fonction se fait en plusieurs tapes On d finit ce dont elle a besoin en entr e et ce qu'elle retourne en sortie On crit le prototype Le prototype indique notamment le nombre et les types des arguments n cessaires ainsi que le type du r sultat renvoy Le prototype est d clar avant la d finition de la fonction Il permet au compilateur de contr ler la coh rence des appels Cette tape n'est pas obligatoire mais le compilateur doit conna tre la fonction avant qu'elle ne soit appel e Si le programmeur ne d sire pas tablir de prototype il doit coder le corps de la fonction appel e avant de coder le corps de la fonction appelante On crit enfin le corps de la fonction on code le traitement attendu Cette d finition peut tre plac e dans le m me fichier source que la fonction appelante ou dans un autre fichier mais il faudra indiquer au compilateur quels fichiers utiliser Il n'y a pas de possibilit d'imbrication des fonctions comme en Pascal D finition de fonction Syntaxe d'une fonction visibilit classe type de retour nom-de-fonction d clarations de param tres Instructions Visibilit Classe Cet l ment sera vu dans le chapitre traitant de la visibilit et des classes d'allocation des variables Type de retour Cet l ment indique le type du r sultat renvoy par la fonction Ce type peut tre simple int char etc ou plus complexe Si la fonction ne renvoie aucun r sultat un type sp cial void permet d'indiquer ce fait S'il n'est pas pr cis le type d'une fonction est int par d faut Nom-de-Fonction Le nom d'une fonction peut tre n'importe quel identificateur valide D clarations d'arguments Ce sont les donn es venant de l'ext rieur qui sont n cessaires l'ex cution de la fonction Ils sont plac s entre parenth ses Avec ou sans argument les parenth ses sont obligatoires La position des param tres est primordiale Si la fonction re oit des param tres ils seront d clar s sous la forme type identificateur type identificateur Il est bien vident que le type de l'identificateur qui stockera la valeur du param tre re u par la fonction doit tre le m me que le type de la valeur envoy e par la fonction appelante Si tel n'est pas le cas il y aura conversion implicite si c'est possible avec perte si le type du param tre re u n'est pas suffisanmment grand pour stocker le param tre envoy Chaque param tre est s par d'un autre par une virgule Ces param tres sont locaux la fonction o ils sont d clar s Deux fonctions distinctes peuvent donc utiliser chacune des m me noms de variables pour leurs param tres Bloc de la fonction Celui ci commence par une accolade ouvrante et se termine par une accolade fermante comme pour le main A l'int rieur on trouve dans l'ordre La d claration des variables locales Les instructions ou blocs d'instructions de la fonction Prototype des fonctions Plac s en t te du programme au maximum avant le codage de la premi re fonction les prototypes de fonctions sont facultatifs mais ont pour int r t de v rifier la validit en quantit et qualit des param tres transmis aux fonctions de ne pas tre oblig de coder la fonction appel e avant la fonction appelante appelante ce qui est impossible si deux fonctions s'appellent l'une l'autre On crit un prototype de fonction en crivant le type de la fonction le nom de la fonction le type des param tres entre parenth ses s par s par une virgule le nom des param tres n'est pas obligatoire Si la fonction n'a pas recevoir de param tre on peut mettre le mot clef void dans les parenth ses ou ne rien mettre un point-virgule final obligatoire Il n'y a l'ex cution aucun contr le ni sur le nombre ni sur le type des param tres D'o l'int r t d'utiliser un prototype syst matique afin de d tecter la compilation les erreurs non d cel es l'ex cution Exemple void fonc fonc ne re oit rien et ne renvoie rien void fonc void fonc ne re oit rien et ne renvoie rien comme fonc void fonc int fonc re oit un int et ne renvoie rien float fonc int char fonc re oit un int et un char et renvoie un float double fonc void fonc ne re oit rien et renvoie un double double fonc double fonc re oit un double et renvoie un double Appel d'une fonction Une fonction est appel e par l'utilisation de son nom suivi de deux parenth ses obligatoires contenant ventuellement des param tres effectifs Ces derniers peuvent tre soit des variables soit des constantes soit des expressions Un appel de fonction tant une instruction celle-ci a pour valeur r siduelle la valeur renvoy e par la fonction et cette valeur peut tre utilis e comme n'importe quelle autre valeur Exemple fonc Appel de fonc sans param tre ni utiliser ce qu'elle renvoie fonc Appel de fonc sans param tre ni utiliser ce qu'elle renvoie fonc Appel de fonc en lui passant une valeur num rique fonc a Appel de fonc avec deux param tres un calcul valant et a resultat fonc i j Appel de fonc en r cup rant son r sultat dans une variable resultat fonc Utilisation du r sultat de fonc dans une expression fonc fonc Appel de fonc en lui passant un calcul utilisant fonc fonc fonc Appel de fonc en lui passant un calcul utilisant fonc Passage de param tres Chaque param tre est initialis automatiquement avec la valeur pass e par l'appelant A l'appel de la fonction les valeurs pass es par l'appelant param tres r els ou effectifs sont recopi s dans les identifiants de la fonction param tres formels et cette derni re travaille sur ces copies stock es dans la pile cf cours sur les processus Unix Le nom donn ces variables de copie importe peu A la sortie de la fonction la zone de la pile occup e par les param tres est lib r e Les valeurs de l'appelant n'ayant pas t touch es celles-ci ne sont jamais modifi es par la fonction sauf si un des param tres pass s est un tableau cf paragraphe sur les cas particuliers Dans ce cas la fonction recevant un tableau re oit l'original et non une copie et peut modifier le contenu du tableau cf chapitre sur les pointeurs Exemple Prototype d'une fonction affiche recevant un nombre entier et ne renvoyant rien void void affiche int Fonction principale du programme main int nb Nombre afficher affiche nb Appel de la fonction affiche printf nb d n nb Affichage de nb pour voir s'il a chang Codage de la fonction affiche void affiche int x Variable o stocker le param tre re u Affichage du nombre re u but de la fonction affiche printf Nombre re u d n x Modification du param tre re u juste pour voir x x Retour du r sultat Une fonction peut renvoyer le r sultat de son travail Ceci sera fait gr ce l'instruction return expression les parenth ses ne sont pas obligatoires Cette instruction interrompt le d roulement de la fonction et ex cute le retour la fonction appelante qui peut r cup rer ou simplement utiliser le r sultat renvoy On peut trouver plusieurs return dans une fonction bien que ce soit contraire la notion de programmation structur e chaque return n' tant trait que si certaines conditions se pr sentent En ce cas lors de l'appel et selon les conditions valu es la fonction sortira l'un ou l'autre des return Une fonction ne renvoyant rien void n'a pas l'utilit du return Cependant celui-ci peut tre utilis dans la mesure o il ne sert qu' interrompre l'ex cution de la fonction sans vouloir renvoyer de r sultat On emploie alors l'instruction return unique sans parenth se ni expression La fonction main La fonction main est une fonction au m me titre que les autres De plus elle renvoie elle-aussi une valeur de type int par d faut au processus qui invoque le programme Enfin elle peut d clarer recevoir des param tres sera vu ult rieurement ou pas void Exercice Ecrire une fonction permettant de calculer la racine carr e d'un nombre La racine carr e d'un nombre N et not e N correspond un nombre P tel que P x P N Elle est donn e par la limite de la suite U X X nombre quelconque diff rent de Un Un N Un Fonction racine double racine float nb Param tre recevant le nombre dont on veut la racine D claration des variables double calc Calcul de la racine dans la boucle double diff Pour tester la diff rence avec la valeur pr c dente Si la racine n'a pas besoin d' tre calcul e pour ou if nb nb return nb Ici racine de nb vaut nb Initialisation d but de boucle calc nb Ou n'importe quel nombre diff rent de do R cup ration de calc pour comparer avec le calcul suivant diff calc Approximation de la racine le calcul se fera en pr cision double calc calc nb calc Tant que le processeur peut faire la diff rence entre ce calcul et le pr c dent limite while calc diff Renvoi du r sultat calcul return calc Ou bien return diff puisque ici diff calc Fonction principale du programme juste pour l'exemple int main void D claration des variables float nb Nombre dont on veut la racine Saisie et affichage de la racine printf Entrez votre nombre scanf f nb printf La racine de f est lf n nb racine nb return Remarque La racine carr e d'un nombre N peut aussi tre donn e par l'algorithme suivant choisir variables X et Y avec X diff rent de et boucler sur les op rations suivantes Y N X X X Y A chaque boucle les variables X et Y vont se rapprocher de la racine de N par encadrement Cas particulier fonction recevant un tableau en param tre Un programmeur d sirant appeler une fonction en lui passant un tableau dans l'un des param tres appelle la fonction en mettant entre les parenth ses juste le nom du tableau sans crochet ni indice comme pour printf ou scanf qui sont des fonctions pouvant traiter des cha nes de caract res Du cot de codage de la fonction il faut d clarer une variable de m me type que la variable re ue c'est dire un tableau Quelle que soit sa dimension on peut omettre dans la d claration du tableau la longueur de la premi re dimension nombre entre les premiers crochets Attention une fonction recevant un tableau en param tre a possibilit de modifier le contenu du tableau chose impossible quand le param tre est une variable simple cf chapitre sur les pointeurs Exemple Ecrire une fonction permettant d'afficher une cha ne de caract res l' cran comme le fait printf Rappel Une cha ne de caract res est un tableau de caract res dont le dernier vaut Prototype fonction affiche recevant un tableau de caract res et renvoyant un entier long unsigned long affiche char Remarquez ici les crochets vides Fonction principale du programme int main void D claration des variables char chaine Cha ne afficher est choisi arbitrairement Saisie de la chaine printf Entrez votre cha ne scanf s chaine Attention pas de pour un tableau Affichage de la chaine printf Votre cha ne saisie est affiche chaine Passage du tableau la fonction sans mettre de crochet Fin du programme return Fonction affiche Elle re oit un tableau de caract res et renvoie un entier long non-sign unsigned long affiche char chaine Cha ne afficher la longueur n'est pas obligatoire D claration des variables unsigned long ind Indice de boucle sur le tableau Boucle sur la cha ne jusqu' la valeur conventionnelle for ind chaine ind ' ' ind Affichage de chaque lettre de la cha ne printf c chaine ind Il se trouve que ici ind contient la longueur r elle de la cha ne return ind Renvoi de la longueur tant qu' faire Cas particulier fonction devant renvoyer un tableau Il n'est pas possible dans l' tat actuel de faire renvoyer un tableau par une fonction rappelons-le un tableau n'est pas une entit manipulable par le langage Il faut pour r gler le probl me utiliser les pointeurs cf chapitre sur les pointeurs La r cursivit Il a t vu au chapitre sur les fonctions que celles-ci conservent leur environnement de travail pendant qu'une sous-fonction est ex cut e et qu'il n'y a pas m lange des variables puisque chaque fonction poss de une zone de travail ind pendante des autres fonctions Ceci autorise alors une fonction s'appeler elle-m me fonction r cursive La fonction appelante sera alors mise en attente du r sultat obtenu par la fonction appel e qui peut elle-aussi tre mise en attente par le r sultat Il est vident qu'une fonction r cursive doit poss der une condition d'arr t de r cursivit car sinon la fonction s'appellerait elle-m me l'infini La condition d'arr t se place en g n ral par facilit de programmation au d but du code de la fonction mais ce n'est nullement une obligation R cursivit simple La r cursivit simple est le cas le plus courant La fonction s'appelle elle-m me une fois jusqu' arriver au bout de sa r cursivit Exemple La factorielle de n not n si n alors factorielle n sinon factorielle n n x factorielle n Fonction r cursive factorielle unsigned long fact unsigned short n Nombre dont on veut la factorielle V rification fin de r cursivit if n On peut aussi mettre if n return Factorielle de ou vaut Renvoi du r sultat de n multipli par ce que vaut la fonction pour n return n fact n Ce que vaut fact n sera d'abord calcul dans une sous-fonction etc R cursivit double La r cursivit double est le cas o la fonction s'appelle elle-m me deux ou plusieurs fois Le nombre d'empilements m moire est alors ph nom nal Exemple La suite de Fibonacci est une suite num rique o les deux valeurs U et U sont d j tablies et la valeur Un pour n est donn par l'addition des deux termes pr c dents Un Un Un Fonction r cursive Fibonacci On consid re que U vaut et U vaut unsigned long fib unsigned short n Nombre dont on veut la valeur de Fibonacci V rification fin de r cursivit if n return On renvoie la valeur correspondante U if n return On renvoie la valeur correspondante U Renvoi du r sultat de l'addition des deux appels inf rieurs return fib n fib n R cursivit crois e La r cursivit crois e est le rare cas o une fonction A appelle une fonction B qui elle-m me appelle la fonction A Si un programmeur reprend le travail d'un autre il peut avoir du mal d celer qu'il y a r cursivit d'o l'importance des commentaires Conclusion La r cursivit est un m canisme offrant une tr s grande souplesse de codage au programmeur mais se payant par une consommation tr s importantes des ressources du syst me En effet chaque appel r cursif ce dernier doit sauvegarder tout le contexte de la fonction afin de pouvoir offrir la sous-fonction une zone de travail vierge Par exemple pour la valeur la fonction factorielle s'empilera fois en m moire tandis que la fonction Fibonacci s'empilera fois Tous ces empilements seront autant de contextes de travail diff rents et individuels mais gros consommateurs de ressources syst me lors du d roulement du programme Avant d'employer la r cursivit il faut donc se demander si elle ne peut pas tre vit e par l'emploi de boucles appropri es Exemple La factorielle de n sans r cursivit unsigned long fact unsigned short n Nombre dont on veut la factorielle D claration des variables unsigned short i Indice de boucle unsigned long resultat R sultat de la factorielle Boucle de factorielle for i i n i Si n vaut ou boucle non ex cut e resultat resultat i Calcul de la factorielle interm diaire Renvoi du r sultat toujours au moins gal return resultat Exemple La suite de Fibonacci sans r cursivit unsigned long fib unsigned short n Nombre dont on veut la valeur de Fibonacci D claration des variables unsigned long U Tableau de Un on n'initialise que U et U Test des valeurs particuli res if n n return U n Renvoi U ou U si n vaut ou Boucle de Fibonacci for i i n i U U U Calcul de l' l ment en cours U U D calage de U vers U U U D calage de U vers U Renvoi du r sultat dernier U return U Exercice Changement de base Ecrire une fonction r cursive affichant n'importe quel nombre dans une base inf rieure Rappel Pour afficher un nombre n dans une base b on divise euclidiennement n par b tant qu'on peut diviser D s que le r sultat de la division atteint on affiche dans l'ordre inverse tous les restes des divisions pr c dentes Prototype fonction affiche recevant un nombre long afficher et un nombre court la base void affiche unsigned long unsigned short Fonction principale du programme int main void D claration des variables unsigned long nb Nombre afficher unsigned short base Base d'affichage Saisie du nombre afficher printf Entrez le nombre afficher scanf lu nb Saisie de la base d'affichage contr le de la saisie base Pour tre certain que le while sera vrai while base base Tant que base ou base printf Entrez la base d'affichage entre et scanf hu base Affichage printf Le nombre lu en base hu nb base affiche nb base printf n Fin du programme return Fonction affiche void affiche unsigned long nb Nombre afficher unsigned short base Base d'affichage D claration des variables Aucune variable V rification fin r cursivit if nb return Fin r cursivit Appel r cursif affiche nb base base Affichage du reste plac apr s l'appel r cursif pour tre affich lors de la remont e printf hu nb base Le modulo donne le reste d'une division Etude de cas Le Triangle de Pascal Etude des diff rents solutions Ecrire un programme affichant le triangle de Pascal sur n lignes Rappel Le triangle de Pascal permet de donner les coefficients de multiplication pour d velopper l'expression a b n Les coefficients de cette expression sont ceux de la ligne n Chaque ligne n est construite de la fa on suivante - elle contient n chiffres - le premier et le dernier sont sauf pour la ligne o il n'y a qu'une fois le chiffre - chaque chiffre interm diaire est l'addition du chiffre plac au dessus et du chiffre plac avant ce dernier Exemple - ligne - ligne - ligne - ligne - ligne - ligne - ligne etc Ce triangle peut aussi tre calcul en utilisant les combinaisons C des probabilit s La ligne n est donn par la suite des chiffres C n C n Cnn La combinaison Cxy est donn par la formule y x y - x Le triangle de pascal a pour but de montrer le d veloppement de a b n Par exemple la ligne du triangle permet de d velopper a b a b a a b a b a b a b b Principe des diff rentes solutions Toutes les solutions d velopp es dans cette tude de cas auront sensiblement le m me squelette de programme Fonction principale du programme cette fonction aura pour but de faire saisir le nombre de lignes voulu pour le triangle et de l'afficher Fonction ligne cette fonction aura pour but d'afficher une ligne du triangle et sera appel e autant de fois qu'il le faut par la fonction principale Fonction comb cette fonction calculera la combinaison voulue Elle sera appel e autant de fois qu'il le faut par la fonction ligne puisqu'une ligne du triangle de Pascal est une liste de combinaisons Fonctions diverses relatives aux diff rentes solutions permettant d'aider au calcul de la combinaison Solution Utilisation de la factorielle pour calculer les combinaisons D finitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilis es double fact ushort Factorielle ulong comb ushort ushort Combinaison void ligne ushort Ligne du triangle Fonction principale int main void D claration des variables ushort i Indice de boucle ushort limite Limite du triangle demand e Saisie de la limite du triangle printf Entrez la limite du triangle voulue scanf hu limite Boucle jusqu'au niveau demand for i i limite i Affichage de la ligne i ligne i Fin du programme return Affichage d'une ligne lig void ligne ushort lig N de ligne afficher D claration des variables ushort col Indice de colonne Boucle jusqu'au niveau demand for col col lig col Affichage de la combinaison C col lig printf lu comb col lig Fin de ligne printf n Calcul de la combinaison C x y ulong comb ushort col Colonne ushort lig Ligne D claration des variables Pas de variable Si on est en premi re ou derni re colonne facultatif mais optimise la fonction if col col lig return Valeur du triangle connue Si on est en seconde ou avant-derni re colonne facultatif mais optimise la fonction if col col lig - return lig Valeur du triangle connue Renvoi du calcul return fact lig fact col fact lig - col Calcul de la factorielle double fact ushort nb Nombre lever en factorielle D claration des variables Pas de variable Si nb vaut ou la factorielle vaut si nb vaut la factorielle vaut if nb Renvoi de la factorielle directe return nb nb Renvoi de nb multipli par la valeur de la factorielle pour nb - return nb fact nb - Cette solution a l'inconv nient d'appeler fois la fonction fact pour chaque combinaison et cette derni re va g n rer de tr s grands nombres qu'il faudra stocker d'o la raison du type double de cette fonction avant que ceux-ci ne se divisent mutuellements dans la combinatoire Ce programme est donc limit par la valeur maximale que peut donner un nombre au format double Le triangle devient d'ailleurs faux partir de la ligne Solution M thode par addition des valeurs de la ligne pr c dente D finitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilis es ulong comb ushort ushort Combinaison void ligne ushort Ligne du triangle Fonction principale int main void D claration des variables ushort i Indice de boucle ushort limite Limite du triangle demand e Saisie de la limite du triangle printf Entrez la limite du triangle voulue scanf hu limite Boucle jusqu'au niveau demand for i i limite i Affichage de la ligne i ligne i Fin du programme return Affichage d'une ligne lig void ligne ushort lig N de ligne afficher D claration des variables ushort col Indice de colonne Boucle jusqu'au niveau demand for col col lig col Affichage de la combinaison C lig col printf lu comb col lig Fin de ligne printf n Calcul de la combinaison C x y par addition ulong comb ushort col Colonne ushort lig Ligne D claration des variables Pas de variable Si on est en premi re ou derni re colonne fin de r cursivit if col col lig return Valeur du triangle connue Si on est en seconde ou avant-derni re colonne facultatif mais optimise la fonction if col col lig - return lig Valeur du triangle connue Renvoi de l'addition des deux nombres du dessus return comb col - lig - comb col lig - Cette solution semble plus int ressante car on limine d'abord la factorielle g n ratrice de grands nombres De plus en premi re lecture on voit qu'il n'y a plus que appels r cursifs au lieu des de la solution pr c dente Cependant si on regarde mieux on s'aper oit qu'on est dans un cas de double r cursivit o chaque appel r cursif en encha ne autres ce qui am ne rapidement saturation du syst me Effectivement cette solution convient un peu mieux que la pr c dente car elle ne g n re pas de grands nombres et elle fonctionne pour un triangle de plus de lignes mais le temps de traitement s'accro t exponentiellement en fonction de la ligne affich e Solution Conservation des combinaisons d j calcul es D finitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilis es void comb ushort ushort ulong Combinaison void ligne ushort ulong Ligne du triangle Fonction principale int main void D claration des variables ushort i Indice de boucle ushort limite Limite du triangle demand e ulong tab comb Tableau des combinaisons calcul es Saisie et contr le de la limite du triangle while printf Entrez la limite du triangle voulue max scanf hu limite if limite break printf hu trop grand Recommencez n limite Boucle jusqu'au niveau demand for i i limite i Affichage de la ligne i et m morisation dans le tableau des combinaisons ligne i tab comb Fin du programme return Affichage d'une ligne lig et m morisation de cette ligne dans le tableau des combinaisons void ligne ushort lig N de ligne afficher ulong tab comb Tableau des combinaisons D claration des variables ushort col Indice de colonne Boucle jusqu'au niveau demand for col col lig col M morisation de la combinaison dans le tableau comb col lig tab comb Affichage de la combinaison C col lig printf lu tab comb lig col Fin de ligne printf n M morisation de la combinaison C x y dans le tableau void comb ushort col Colonne ushort lig Ligne ulong tab comb Tableau des combinaisons D claration des variables Pas de variable Si on est en premi re ou derni re colonne pas assez d'ant c dents if col col lig tab comb lig col Valeur du triangle connue return Plus la peine de continuer Si on est en seconde ou avant-derni re colonne facultatif mais optimise la fonction tab comb lig col lig Valeur du triangle connue return Plus la peine de continuer Ici on est certain de ne pas tre dans les valeurs extr mes du triangle M morisation de l'addition des deux nombres du dessus tab comb lig col tab comb lig col tab comb lig col Cette solution vite la r cursivit mais implique la gestion d'un tableau de valeurs calcul es Elle implique aussi de conna tre l'avance le nombre de lignes du triangle donc oblige programmer un contr le sur la saisie et un gaspillage de de la m moire car on est oblig de d clarer un tableau carr alors que les valeurs calcul es n'en occupent que sa moiti Cependant la rapidit d'ex cution est exponentiellement plus avantageuse que toutes les solutions pr c dentes et permet un triangle de lignes tout en tant facilement modifiable pour calculer des triangles plus gros Et enfin l'utilisation de fonctions d'allocation dynamique de m moire permettra d' liminer le gaspillage de m moire en n'allouant que ce qui est n cessaire au stockage mais n cessitera une programmation plus pouss e cf chapitre sur la gestion de la m moire Solution Calcul de la combinaison par simplification de la fraction D finitions des alias sur des types existants plus pratique pour programmer typedef unsigned short ushort Entier court non sign typedef unsigned long ulong Entier long non sign Prototypes des fonctions utilis es ulong comb ushort ushort Combinaison void ligne ushort Ligne du triangle Fonction principale int main void D claration des variables ushort i Indice de boucle ushort limite Limite du triangle demand e Saisie et contr le de la limite du triangle printf Entrez la limite du triangle voulue scanf hu limite Boucle jusqu'au niveau demand for i i limite i Affichage de la ligne i ligne i Fin du programme return Affichage d'une ligne lig void ligne ushort lig N de ligne afficher D claration des variables ushort col Indice de colonne Boucle jusqu'au niveau demand for col col lig col Affichage de la combinaison C lig col printf lu comb col lig Fin de ligne printf n Calcul de la combinaison C x y par simplification de la fraction ulong comb ushort col Colonne ushort lig Ligne D claration des variables ushort i Indice de boucle ushort j Indice de boucle ushort pivot Pivot de d part de la multiplication ulong res R sultat de la combinaison Si on est en premi re ou derni re colonne facultatif mais optimise la fonction if col col lig return Valeur du triangle connue Si on est en seconde ou avant-derni re colonne facultatif mais optimise la fonction if col col lig - return lig Valeur du triangle connue Recherche du pivot point partir duquel on commencera multiplier pivot lig - col col lig - col col Calcul de la combinaison par multiplication et division simultan e res for i pivot j i lig i j res res i j Renvoi du r sultat return res Cette solution peut- tre consid r e comme la meilleure Elle b n ficie du fait que le calcul de C tout comme le calcul de C sont identiques et se font en faisant x x x x les nombres et ou et sont des nombres pivots de ce calcul De plus grace l' volution parall le de deux indices on peut multiplier et diviser simultan ment ce qui vite au r sultat de la combinaison de grossir d mesur ment et inutilement Et math matiquement la division sera toujours parfaite puisque le second indice commence Conclusion Diff rentes solutions m me programm es avec rigueur ne produisent pas forc ment un travail r ellement efficace car elles sont limit es d'une part par les contraintes du langage et d'autre part par les limites du syst me sur lequel sera implant le programme Il vaut mieux r fl chir d'abord au probl me et l'optimisation ventuelle de sa solution avant de commencer coder La visibilit des variables - Les classes d'allocation des variables Visibilit des variables La visibilit d'une variable concerne l'endroit du source o la variable est accessible lisible ou modifiable Variable locale Une variable locale est une variable qui a t d clar e dans un bloc d'instructions Rappel Chaque bloc d'instructions encadr par des accolades peut se composer de variables d clar es avant toute instruction et d'instructions La variable locale est locale pour le bloc et tous ses sous-blocs ventuels Elle ne sera donc accessible lisible ou modifiable que depuis le bloc o elle a t d clar e et tous ses sous-blocs ventuels Puisque la variable n'est vue que du bloc rien n'emp che deux blocs distincts d'avoir une variable de m me nom Si des blocs imbriqu s ont chacun une variable du m me nom le sous-bloc ne verra plus que sa variable et ne verra plus la variable d clar e dans le bloc sup rieur Une variable locale qui n'est pas initialis e par le programmeur est cr e par d faut avec un contenu impr visible Exemple int main void Bloc num ro int var Cr ation variable var du bloc var Affectation variable var du bloc Bloc num ro var Affectation variable var du bloc printf var d n var Affichera Fin de bloc num ro printf var d n var Affichera encore Bloc num ro int var Cr ation variable var du bloc var Affectation variable var du bloc printf var d n var Affichera Fin de bloc num ro printf var d n var Affichera toujours bloc termin Variable globale Une variable globale est une variable qui a t d clar e en dehors de tout bloc d'instructions Elle sera alors visible depuis sa d claration jusqu' la fin du fichier source mais sera masqu e par toute variable locale du m me nom Par ailleurs une variable globale sera connue de tout le programme On pourra donc y acc der dans une fonction m me situ e dans un autre source condition de la d clarer en extern dans ce dernier cf chapitre sur les classes d'allocation Cependant les programmeurs n'aiment pas utiliser des variables globales car en cas d'incoh rence du contenu de la variable dans un programme mal crit il est difficile de rep rer l'endroit o a pu se produire l'erreur d' criture Rien n'emp che de d clarer dans un bloc quelconque une variable locale de m me nom qu'une variable globale A partir de ce moment et jusqu' la fin du bloc la variable globale sera masqu e par la variable locale et le langage n'aura plus acc s qu' cette derni re Une variable globale qui n'est pas initialis e par le programmeur est cr e par d faut avec son contenu mis z ro Exemple Prototypes de trois fonctions neutres void fonction void void fonction void void fonction void int main void int var Cr ation variable locale var var printf var d n var Affichera fonction Appel de fonction int var Variable globale mais pas connue du main Fonction fonction void fonction void printf var d n var Affichera la variable globale var Modification de la variable globale fonction Appel de fonction Fonction fonction void fonction void int var Cr ation variable locale var var printf var d n var Affichera la variable locale fonction Appel de fonction Fonction fonction void fonction void printf var d n var Affichera la variable globale Classes d'allocation des variables La classe d'allocation d'une variable concerne la fa on dont sera stock la variable dans la m moire ce qui influe sur sa dur e de vie temps d'ex cution du programme durant lequel on est certain de conserver le contenu de la variable intacte Classe automatique mot-clef auto La variable est cr e et supprim e de la m moire automatiquement par le programme quand il n'en a plus besoin C'est le cas entre autres des param tres des fonctions Toute variable d finie sans classe d'allocation est plac e en classe automatique par d faut Toutes les variables vues jusqu' pr sent dans les exemples taient en classe automatique auto int n Le mot clef auto n'est pas obligatoire Classe registre mot-clef register La variable est stock e dans un registre m moire tr s rapide si c'est possible registre disponible taille de la variable suffisamment petite pour y tenir etc Dans le cas contraire le compilateur ne signale rien mais consid re la variable comme automatique On peut optimiser les boucles d'un programme en pla ant les indices de boucle dans des registres mais aujourd'hui les compilateurs sont tr s performants et optimisent les variables d'un programme mieux qu'un programmeur ne sait le faire Il vaut donc mieux ne pas interf rer avec le compilateur en n'essayant pas de placer des variables dans des registres la place de ceux-ci Par ailleurs il ne faut pas esp rer pouvoir placer un double octets un tableau ou une cha ne de caract res tableau de caract res dans un registre register int n Si la mise en registre n'est pas possible n sera auto Classe statique mot-clef static La variable est stock e dans une zone m moire et y restera jusqu' la fin d'ex cution du programme Cela garanti donc dans le cas de fonction appel e plusieurs fois que la variable n'est pas perdue entre chaque appel permet de programmer un compteur d'appels par exemple Par ailleurs dans le cas d'un programme crit avec plusieurs sources la variable n'est connue que du source dans lequel elle est d finie Ceci permet ainsi d'avoir plusieurs variables globales ou plusieurs fonctions portant un m me nom mais n'ayant pas un m me but chaque variable globale ou chaque fonction but diff rent tant plac dans un source diff rent Enfin cela permet d'avoir une variable dont la valeur initiale est garantie car elle est initialis e par d faut De plus si elle est initialis e lors de la d claration cette initialisation ne se fait qu'une seule fois m me si la fonction o est d clar e cette variable est appel e plusieurs fois static int n L'initialisation ne se fera qu'une seule fois Exemple Fonction quelconque void fonction void D claration des variables static int n Variable statique valeur conserv e initialis e une fois Programmation n Valeur incr ment e chaque appel de fonction Classe externe mot-clef extern Cette classe permet de d clarer une variable sans lui r server de place en m moire Cela est en g n ral utilis dans le cas d'un programme tenant sur plusieurs fichiers sources o la m me variable forc ment globale est utilis e dans les diff rents fichiers sources En effet pour passer du c au o le compilateur effectue une premi re analyse du source et toute variable utilis e dans une fonction doit tre d clar e avant son utilisation Le programmeur est donc oblig de d clarer sa m me variable dans chaque fichier source Mais si pour chaque fichier o g n r le compilateur r serve un emplacement m moire pour la variable d clar e l' diteur de lien ne comprendra pas que toutes ces variables d clar es ne concernent qu'une seule entit m moire pour le programme et produira alors une erreur de compilation C'est pourquoi la variable ne doit tre d finie r serv e en m moire que dans un seul source en g n ral celui qui contient la fonction main et seulement d clar e avec le mot extern dans les autres sources Il n'y a dans ce dernier cas aucune r servation m moire lors de la d claration C'est ici qu'on fait la diff rence entre d claration et d finition Enfin il n'est pas possible de d clarer une variable en extern et l'initialiser en m me temps car il n'y a pas de m moire associ e la variable extern int var Interdit d' crire extern int var Exemple de travail sur la m me variable avec plusieurs sources Source contenant la fonction main D finition de var int var D claration de fonction fctX void fctX void Programme principal int main void Appel de fctX fctX Source contenant la fonction fctX D claration de var extern int var D finition de fonction fctX void fctX void Utilisation de var printf var d n var Il est aussi possible de d clarer une variable en extern dans le m me fichier source que celui ou elle est d finie lorsqu'on veut dans un soucis de rigueur de programmation d clarer dans chaque fonction toutes les variables qu'elle utilise y compris les variables globales Il est donc n cessaire pour ces derni res de les d clarer dans la fonction en extern int var Variable globale connue de toutes les fonctions Fonction quelconque void fonction void D claration des variables extern int var Ce programmeur rigoureux indique ainsi qu'il a l'intention d'utiliser la variable globale var Un autre programmeur qui arrive dans le projet voit facilement que la fonction utilisera var Si var est modifi e par erreur il sera facile de r pertorier toutes les fonctions l'utilisant R sum visibilit dur e de vie En sachant que visibilit signifie o on peut voir la variable et dur e de vie signifie combien de temps la variable garde-t-elle sa valeur on peut tablir le tableau r sum suivant auto register static extern Variable locale Visibilit Le bloc dans lequel elle est d finie Le bloc dans lequel elle est d finie Le bloc dans lequel elle est d clar e Dur e de vie Le temps du programme Variable globale Visibilit Le source dans lequel elle est d finie Le source dans lequel elle est d finie Le source dans lequel elle est d clar e Dur e de vie Le temps du programme Les exceptions const et volatile Il est possible de demander au compilateur de prot ger la valeur initialis e d'une variable contre toute modification ult rieure affectation incr ment etc en mettant le mot const devant la d claration de la variable Le mot volatile n'existe que pour tre l'oppos de const en indiquant que la variable est modifiable toute variable est modifiable par d faut Il peut para tre bizarre de vouloir une variable non-modifiable En g n ral on s'en sert pour prot ger les tableaux pass s en param tres d'une fonction et on va indiquer ainsi que la fonction n'a pas le droit de modifier le contenu du tableau qu'elle re oit Exemple void fonc const int tab Le contenu de tab est invariable const float pi Le nombre pi est invariable tab x Interdit quel que soit x pi Interdit aussi Les pointeurs Au contraire des bruits qui courent propos du langage C les pointeurs ne pr sentent aucune difficult appr hender pour peu qu'ils soient vus sans pr cipitation ni inqui tude subjective G n ralit s Il a t vu que toute variable en langage C ne contient que du nombre valeur num rique code ascii etc Cependant chaque variable est situ e un emplacement m moire num rot appel aussi adresse Le langage C offre au programmeur le moyen de r cup rer cette adresse et de la stocker dans une autre variable A partir de cette seconde variable il est naturellement possible de conna tre sa valeur comme toute variable habituelle du langage C mais comme cette valeur correspond l'adresse d'une premi re variable il est aussi possible de conna tre la valeur de la premi re Cette seconde variable qui contient l'adresse de la premi re est appel e pointeur Dans tout ce chapitre et afin de distinguer les valeurs adresse des valeurs classiques toutes ces valeurs ne sont la base que des nombres les adresses commenceront toujours par x ce qui correspond la notation num rique en hexad cimal Premier essai de pointeur Premier pointeur Le pointeur simple D clarons une variable appel e var et contenant la valeur float var Il se trouve que cette variable var a t stock e en m moire un emplacement appel adresse Nous pouvons mettre l'hypoth se que var est stock e en m moire l'adresse x Voici un sch ma de la m moire ce moment l Adresse Nom Contenu x var Si on demande au langage affiche var il nous donnera naturellement printf La valeur de var est f n var Affichera Cependant le langage C offre au programmeur un op rateur permettant de r cup rer non plus la valeur d'une variable mais l'adresse d'une variable L'op rateur qui permet d'avoir l'adresse de est l'op rateur unaire dont on a d j parl lors de scan f Si on demande au langage affiche adresse de var il donnera x printf L'adresse de var est x x n var Affichera x D clarons maintenant une seconde variable appel e pt et contenant la valeur x int pt x Cette seconde variable pt a t stock e un second emplacement m moire seconde adresse de valeur x par exemple Voici un sch ma de la m moire ce moment l Adresse Nom Contenu x var x pt x Si on demande au langage affiche pt il nous donnera naturellement son contenu x Si on demande au langage affiche adresse de pt il donnera x printf La valeur de pt est x x n pt Affichera x printf L'adresse de pt est x x n pt Affichera x Cependant ici il est possible de demander affiche ce qu'il y a l'adresse x Et en tout tat de cause on cherche obtenir la valeur Il se trouve que la valeur x est stock e dans pt et que l'op rateur qui permet d'avoir ce qu'il y a l'adresse de est l'op rateur unaire qui se dit aussi valeur point e par printf La valeur de pt est f n pt On cherche avoir Le soucis du langage C est que la valeur est stock e dans un float qui utilise octets en m moire Lorsqu'on demande au langage le contenu de var le compilateur conna t le type de var qui est float et sait qu'il faut lire alors zones m moires contigu s pour avoir la valeur demand e petite parenth se pt est une variable int donc stock e elle aussi sur octets m moires Voici un sch ma exact de la m moire ce moment l Adresse Nom Contenu x var x x x x pt x x x x Ainsi quand on demande le contenu de pt contenu de ce qu'il y a l'adresse repr sent e par pt le compilateur ne sait pas combien de zones m moires il faut lire l'adresse x il peut y avoir un char un double ou un autre type cette adresse Bien entendu le compilateur sait faire le lien entre var et son type float octets mais ne sait pas faire ce lien dont on a besoin l'adresse x il y a un float Pour que le compilateur puisse faire ce dernier lien il faut lui indiquer que ce qui est point par pt ou plus simplement pt est un float attention pt de lit toile pt int pt x Cette instruction n'est pas correcte float pt x Voici ce qu'il faut crire Peut se lire indiff remment de deux mani res diff rentes - toile pt est de type float - pt est de type float toile ou pointeur sur float printf La valeur de pt est f n pt On aura maintenant Dans la seconde et correcte d claration il est automatiquement d clar deux entit s utilisables par le langage pt est de type float donc le langage saura qu'il faut r cup rer octets m moire si on lui demande la valeur de pt pt est de type int contenant l'adresse d'un float pt est de type float toile n'oubliez jamais de prononcer le mot toile quand vous parlez de votre pointeur Puisque var donne aussi x on peut utiliser cette derni re galit float pt var D claration r elle du pointeur pt Attention la valeur var sera affect e pt et non toile pt var x pt x x var x pt x x pt est un pointeur sur un float Second pointeur Le pointeur sur un pointeur ou double pointeur En continuant les essais d clarons une troisi me variable appel e dpt et contenant la valeur x int dpt x Cette troisi me variable dpt a t stock e un troisi me emplacement m moire troisi me adresse de valeur x par exemple Voici de nouveau le sch ma exact de la m moire ce moment l Adresse Nom Contenu x var x x x x pt x x x x x dpt x x x x Si on demande au langage affiche dpt il nous donnera comme pour toute autre variable le contenu de dpt soit x Si on demande au langage affiche adresse de dpt il donnera x printf La valeur de dpt est x x n dpt Affichera x printf L'adresse de dpt est x x n dpt Affichera x Mais c'est encore le m me probl me si on demande affiche dpt affiche ce qui est point par dpt le compilateur ne sait pas combien de zones m moires il faut lire l'adresse x Pour que le compilateur s'en sorte on peut lui indiquer que dpt est un int puisqu' l'adresse x il y a un int et essayer l' criture suivante int dpt x Cette instruction n'est pas correcte int dpt x Essayons celle-l printf La valeur de dpt est x x n dpt On aura probablement x Si on demande maintenant affiche dpt on aura probablement x et on peut se dire qu'on a r ussi Mais si on demande affiche dpt affiche ce qui est point par ce qui est point par dpt le compilateur ne connaissant pas le type de dpt est de nouveau bloqu Pourtant ce lien entre dpt et existe virtuellement il ne reste plus qu' l'indiquer au compilateur Pour que ce dernier s'en sorte il faut indiquer que dpt est un float int dpt x Cette instruction n'est pas correcte int dpt x Celle-l non plus float dpt x Voici ce qu'il faut crire printf La valeur de dpt est x x n dpt On a toujours x printf La valeur de dpt est f n dpt Et ici on a Dans la troisi me et correcte d claration il est d clar alors trois entit s utilisables par le langage dpt est de type float donc le langage saura qu'il faut r cup rer octets m moire si on lui demande le contenu de dpt dpt est de type int contenant l'adresse d'un float dpt est de type float toile toujours ne pas oublier le mot toile Le langage saura donc acc der au contenu de dpt dpt est de type int contenant l'adresse de l'adresse d'un float dpt est de type float toile toile en pronon ant autant de fois le mot toile qu'il le faut Puisque pt donne x on peut encore utiliser cette derni re criture float dpt pt D claration r elle du pointeur dpt Toujours pareil la valeur pt sera affect e dpt et non dpt dpt est un pointeur sur un pointeur sur un float var x pt x x dpt x x var x pt x x dpt x x Remarque Ne confondez pas pt adresse de pt x pt valeur de pt x et pt valeur de la case situ e l'adresse x R capitulatif Voici un r capitulatif du premier programme manipulant des pointeurs int main void float var D claration de la variable var float pt var D claration du pointeur pt float dpt pt D claration du pointeur dpt float pi D claration d'une variable pi printf La valeur de var est f n var Affichera printf L'adresse de var est x x n var Affichera x printf La valeur de pt est x x n pt Affichera x printf L'adresse de pt est x x n pt Affichera x printf La valeur de pt est f n pt Affichera printf La valeur de dpt est x x n dpt Affichera x printf L'adresse de dpt est x x n dpt Affichera x printf La valeur de dpt est x x n dpt Affichera x printf La valeur de dpt est f n dpt Affichera Je peux manipuler n'importe quelle des trois premi res variables pi var Je peux utiliser var pi pt Je peux utiliser pt pi dpt Je peux utiliser pt Les parenth ses sont obligatoires sinon le compilateur traduit par pi pi pt Remarques Un pointeur contenant toujours une adresse implique qu'un pointeur est toujours une variable au format entier quel que soit l'objet qu'il y a au bout Si pt vaut x ne confondez pas pt contenu de la case nomm e pt x et pt contenu de la case dont l'adresse est x Si on demande var le compilateur ira chercher ce qui est point par l'adresse var autrement dit var Les op rateurs et s'annulent mutuellement Pointeurs et tableaux D clarons un tableau de nombres virgule flottante float tab Voici un sch ma simplifi de la m moire ce moment l Adresse Nom Contenu x tab x tab x tab Remarque En fait les adresses ne sont pas r ellement celles-l car pour chaque l ment il lui est r serv octets en m moire donc les adresses r elles sont d cal es de et non de Mais il est pr f rable pour l'instant de les symboliser ainsi pour bien montrer que les l ments se suivent en m moire Il se trouve que lorsque le compilateur cr e un tableau il cr e en plus une variable suppl mentaire dont l'identificateur est le nom du tableau sans crochet et le contenu est l'adresse du premier l ment tab Adresse Nom Contenu x tab x tab contient une adresse et au bout de cette adresse tab il y a un nombre de type float tab est donc un pointeur sur un float tab est donc un float toile Le nom d'un tableau est toujours un pointeur sur son premier l ment tab tab Op ration sur les pointeurs Si on demande au langage affiche tab il nous donnera comme pour toute variable d j vue le contenu de tab soit x Si on demande au langage affiche ce qui est point par tab affiche tab il donnera qui correspond aussi tab Si on demande au langage affiche tab il nous donnera naturellement le contenu de tab ajout de c'est dire x Si on demande au langage affiche ce qui est point par tab affiche tab il donnera qui correspond aussi tab Il en r sulte la r gle suivante tab n tab n Enfin si on demande l'adresse de tab tab on aura x qui peut aussi tre obtenu par tab Il en r sulte la seconde r gle suivante tab n tab n Remarque Puisque les op rateurs et s'annulent l'un l'autre on peut passer de la premi re r gle la seconde en rajoutant l'op rateur de chaque cot de l' galit et on peut passer de la seconde la premi re en rajoutant l'op rateur de chaque cot de l' galit Ces r gles tant normalis es elles restent valable m me si on consid re les adresses r elles de la m moire d cal es de dans le cas du float et non de Adresse Nom Contenu x tab x x tab x tab x tab Ainsi lorsqu'on rajoute n un pointeur sur un type particulier le langage r tablit le vrai calcul et multiplie n par la taille du type Donc si on demande au langage tab il nous donnera x et non x tab n est traduit par tab n sizeof type de tab Ceci permet en utilisant un second pointeur d'acc der aux l ments d'un tableau plus rapidement qu'en utilisant les crochets car dans ce dernier cas le compilateur ins re dans le code assembleur des instructions de calcul pour acc der l'indice n partir du d but du tableau alors qu'avec un pointeur le point d'acc s l'indice n est d j cr et pr t l'emploi Exemple d'acc s aux valeurs d'un tableau int main void D claration des variables float tab f f f Tableau de trois flottants float pt Pointeur sur un flottant int i Indice de boucle Balayage du tableau en utilisant un indice classique for i i i printf tab u f n i tab i L'acc s tab i implique un calcul Balayage du tableau en utilisant un pointeur plus rapide for i pt tab i i pt i sert seulement pour quitter la boucle printf tab u f n i pt L'acc s pt ne demande aucun calcul Fin du programme return O la logique d montre l'impossible Prenons la premi re des r gles d montr es pr c demment tab n tab n et d veloppons l jusqu' l'extr me tab n tab n premi re des r gles tab n n tab commutativit de l'addition tab n n tab par d duction n tab n tab par simple application de la premi re r gle Il en r sulte qu'on est autoris crire tab n ou n tab en langage C lorsqu'on d sire atteindre un des l ments d'un tableau De la m me fa on si on applique la premi re r gle un tableau deux dimensions on obtient le raisonnement suivant tab x y tab x y par application simple de la premi re r gle sur tab x tab x y tab x y par seconde application de la premi re r gle tab x y x tab y par commutativit entre tab et x x tab y y x tab par commutativit entre x tab et y y x tab y x tab par application inverse de la premi re r gle sur x tab y x tab y x tab par seconde application inverse de la premi re r gle On peut ainsi crire tab x y z ou bien z y x tab dans le cas de tableaux plusieurs dimensions Danger du pointeur Le vrai et seul danger d'un pointeur est d'aller lire ou modifier la zone point e sans la conna tre En effet d finir un pointeur c'est la base une variable sans l'initialiser revient le remplir d'une valeur impr visible Ensuite aller voir ou modifier l'adresse correspondant cette valeur n'est pas du tout une bonne id e Exemple float pt Que contient pt pt O va aller la valeur Voici un sch ma de la m moire Adresse Nom Contenu x pt xxx xxx pt A t-on le droit d' crire l'adresse xxx Cette adresse n'est-elle pas par hasard l'adresse d'une autre variable En g n ral ce genre de manipulation conduit cas le programme plante imm diatement On sait au moins qu'il y a un probl me et on peut le chercher Avec un peu d'habitude on le trouve g n ralement assez rapidement le programme fonctionne sans probl me apparent car il se trouve que l'adresse xxx est libre et accessible C'est le cas le plus grave car le probl me existe mais ne se montre pas pendant essais Puis un jour le programmeur rajoute une variable innocente mais qui utilise l'adresse xxx et le programme plante imm diatement Mais l'erreur est depuis longtemps enfouie dans la masse des lignes de codes Pour viter ce genre d'erreur il ne faut jamais utiliser pt si on n'a pas auparavant rempli pt avec une adresse coh rente connue Tableaux de pointeurs Un pointeur n' tant qu'un nombre rien ne l'emp che d' tre stock avec d'autres nombres de sa cat gorie dans un tableau On nomme un tel tableau un tableau de pointeurs L'utilit d'un tel tableau est courante d s qu'on parle de cha nes Une cha ne de caract re tant un tableau de caract res c'est d j un pointeur Et si on veut manipuler et stocker plusieurs cha nes dans un tableau il devient obligatoire d'utiliser un tableau de pointeurs Cela permet en plus de gagner de la place surtout quand on travaille sur des cha nes de longueurs in gales Exemple de tableau deux dimensions Tableau des jours de la semaine char semaine Tableau de lignes sur colonnes 'l' 'u' 'n' 'd' 'i' colonnes utilis es sur 'm' 'a' 'r' 'd' 'i' colonnes utilis es sur 'm' 'e' 'r' 'c' 'r' 'e' 'd' 'i' colonnes utilis es sur 'j' 'e' 'u' 'd' 'i' colonnes utilis es sur 'v' 'e' n' 'd' 'r' 'e' 'd' 'i' colonnes utilis es sur 's' 'a' m' 'e' 'd' 'i' colonne sutilis es sur 'd' 'i' 'm' 'a' 'n' 'c' 'h' 'e' colonnes utilis es sur Repr sentation de la m moire Adresse Nom Contenu x semaine x x semaine 'l' x semaine 'u' x semaine 'n' x semaine 'd' x semaine 'i' x semaine x semaine non utilis mais r serv perdu x semaine non utilis mais r serv perdu x semaine non utilis mais r serv perdu x semaine 'm' x semaine 'a' x semaine 'r' x semaine 'd' x semaine 'i' x semaine x semaine non utilis mais r serv perdu x semaine non utilis mais r serv perdu x semaine non utilis mais r serv perdu x semaine 'm' etc etc etc Dans cet exemple on perd octets sur c'est dire de la m moire r serv e Cela peut para tre insignifiant au regard des puissances actuelles de nos machines mais transpos e l' chelle d'un vaste projet de m moire perdue ou gagn e peuvent faire la diff rence entre un programme m diocre et un programme de qualit Surtout si la zone est elle-m me dupliqu e plusieurs fois dans un tableau dans une fonction r cursive etc Exemple de tableau de pointeurs Tableau des jours de la semaine char semaine Tableau de pointeurs sur un caract re lundi Pointeur mardi Pointeur mercredi Pointeur jeudi Pointeur vendredi Pointeur samedi Pointeur dimanche Pointeur Repr sentation de la m moire Adresse Nom Contenu x semaine x x semaine x x semaine x x semaine x x semaine x x semaine x x semaine x x semaine x x utilis par d'autres variables utilis par d'autres variables x semaine 'l' x semaine 'u' x semaine 'n' x semaine 'd' x semaine 'i' x semaine utilis par d'autres variables x semaine 'm' x semaine 'a' x semaine 'r' etc etc etc Dans cet exemple on ne perd aucune partie de la m moire Et la manipulation de telles structures ne pose pas de soucis quand on y est habitu Remarque M me dans le cas de tableau de pointeurs on peut encore remplacer l'op rateur par des crochets De plus cette technique de tableau contenant l'adresse d'autres tableaux peut tre g n ralis e pour repr senter des tableaux plusieurs dimensions Malheureusement de tels ensembles deviennent vite difficile sch matiser donc il convient de programmer le langage C avec rigueur afin de ne pas g n rer d'incoh rences Fonctions param tres et pointeurs Modification d'une variable pass e une fonction Il a t vu lors de l'apprentissage des fonctions en C que celles-ci ne pouvaient pas modifier la variable qu'elle re oit en param tre car la fonction n'en re oit qu'une copie Cependant il est possible de passer une fonction l'adresse d'une variable La fonction copiera cette adresse dans une zone temporaire mais saura quel emplacement m moire se trouve la variable d'origine et pourra donc la modifier Exemple de passage d'adresse une fonction int main void float var Variable modifier Appel de la fonction modif var La fonction modif re oit l'adresse de var printf var f n var Repr sentation de la m moire Adresse Nom Contenu x var La fonction va recevoir la valeur x Cette valeur tant un nombre entier on peut se dire qu'elle re oit un int qu'on appellera par exemple pt Cependant comme pour le premier pointeur du chapitre la fonction va devoir aller toucher ce qui est point par pt donc va devoir aller toucher pt Or le langage ne saura pas ce qu'il y a cet endroit si on ne le lui a pas dit Et l'endroit repr sent par pt il y a un float Exemple de la fonction modif void modif float pt Pointeur sur un nombre float Modification de la valeur pt Modification de ce qui est point par pt Repr sentation de la m moire Adresse Nom Contenu x var x pt x Puisque la fonction re oit la valeur x et qu'elle conna t le type de ce qu'il y a cet endroit elle peut le modifier C'est pour cela que la fonction scanf doit imp rativement recevoir l'adresse de la variable saisir Et c'est aussi pour cela qu'on ne passe pas l'adresse d'une cha ne la fonction scanf parce qu'une cha ne est d j un tableau et que nommer une cha ne consiste nommer l'adresse de son premier l ment Remarque Si var est de type float alors var est de type float toile On peut arriver aussi cette remarque en utilisant l'astuce suivante var est de type float donc var est de type float donc var est de type float si on te l' toile d'un cot de l' quation on la replace de l'autre cot Doit-on mettre ou Arriv ce niveau le d butant en C se heurte assez rapidement un dilemne La fonction doit recevoir un float toile et le programme poss de d j une variable pt d clar e comme float toile float pt Le but tant que la fonction re oive la valeur de pt Souvent le d butant se dit elle re oit un float toile je lui passe alors toile pt comme dans l'exemple suivant void modif float param Param tre re u par la fonction Modification de la valeur param Modification de ce qui est point par param int main void D claration des variables float pi Variable pi float pt pi Variable pt contenant l'adresse de pi Programmation modif pt Mauvais modif pt Tr s mauvais modif pt Correct modif pi Correct Examinons nouveau la m moire Adresse Nom Contenu x pi x pt x x param On ne conna t pas le contenu de param Mais notre d sir est qu'il re oive la valeur x afin que la fonction modif puisse aller modifier la valeur si on passe la fonction pt on lui passe ce qui n'est pas le but D'ailleurs pt est de type float alors que la fonction attend un float toile si on lui passe pt on lui passe x ce qui n'est toujours pas bon De plus pt tant de type float toile pt est de type float toile toile et ne correspond pas non plus au type attendu float toile si on lui passe pt on lui passe x ce qui est correct Et pt est de type float toile il correspond au type attendu par la fonction si on lui passe var on lui passe aussi x ce qui est toujours correct Et var est aussi du type attendu par la fonction float toile Fonction renvoyant un pointeur Un pointeur tant une valeur comme une autre la fonction peut renvoyer cette valeur Il suffit alors de d clarer la fonction du type de la valeur qu'elle renvoie Et ainsi on peut avoir des fonctions de type char toile int toile ou double toile selon le cas Exemples de d clarations diverses char f void f renvoie un pointeur sur un caract re int f void f renvoie un pointeur sur un entier double f void f renvoie un pointeur sur un r el double pr cision Pointeur sur rien Pointeur sur tout Ces types de pointeurs vus jusqu' pr sent viennent s'enrichir d'un type nouveau le pointeur universel void toile Il s'agit d'un pointeur pouvant pointer sur n'importe quoi non pr vu l'avance Puisque le type void tait libre et qu'un pointeur sur vide n'avait aucune signification le type void toile est devenu synonyme de pointeur sur tout Evidemment pour utiliser

Related Downloads
Explore
Post your homework questions and get free online help from our incredible volunteers
  1324 People Browsing