Les  √©l√©ments de base en C

1) Introduction
==> Programmer c’est quoi ?
Programmer signifie  r√©aliser des  « programmes  informatiques  ». Les  programmes demandent  √† l’ordinateur d'effectuer des actions.
==> Votre ordinateur est  rempli  de programmes  comme:

      *La calculatrice est  un programme
      * votre traitement  de texte (Word)est  un programme
      * votre logiciel  de chat «WhatsApp» est  un programme
      * les  jeux  vid√©o sont  des  programmes.

==> De quels  logiciels  a-t-on besoin pour programmer ?
Il existe plusieurs enivrements de d√©veloppement (IDE).  Parmi  les environnements  de  d√©veloppement, on peut citer : DEV C++,  Code :: Bloc

Cours en langage C


==>Un minimum de code
Pour n' importe  quel  programme, il  faudra  taper un minimum  de code. Ce code ne fera rien de particulier mais  il  est  indispensable.

!!! pour ouvrir  un nouveau projet (le fichier sur lequel  on va √©crire  notre premier programme ) taper Ctrl+N . apr√®s bien sur d'installation de logiciel Dev C++ , puis √©crire le programme  que vous souhaitez  si vous avez  un peu d'exp√©rience, sinon  taper le programme propos√© ci-dessous , √† la fin d'√©criture le code vous pouvez tester votre programme  est ce qu'il √ßa marche bien ou non en cliquant sur le boutton d’ex√©cution  qui se trouve dans la figure suivante:



Cours en langage C

 
C'est  ce « code minimum  » que nous  allons  d√©couvrir  maintenant. Il  devrait  servir de base pour la plupart  de vos  programmes  en langage C.  


Cours en langage C

int  main()           Ou bien      
     int  main ( int argc , char * argv[] )
Les  deux  √©critures  sont  possibles, mais  la seconde (plus compliqu√©e) est  la plus  courante.   En ce qui  nous  concerne, que l'on utilise l'une ou l'autre des  √©critures, √ßa ne changera rien pour nous. surtout  que nous  n'avons  pas  encore le niveau pour analyser ce que √ßa signifie.

*  #include <stdio.h>
     #include <stdlib.h>
  Ce sont  des  lignes  sp√©ciales  que l'on ne voit  qu'en haut des fichiers source. Ces lignes  sont  facilement  reconnaissables  car elles commencent  par un di√®se #. Ces  lignes  sp√©ciales, on les  appelle directives  de pr√©processeur (un nom  compliqu√©, n'est-ce pas ?). 
Ce sont  des  lignes  qui  seront  lues  par un programme appel√© pr√©processeur, un programme qui  se lance au d√©but  de la compilation.
Le  mot  include en anglais  signifie « inclure » en fran√ßais. Ces  lignes  demandent  d'inclure des  fichiers  au projet, c'est-√†-dire d'ajouter des  fichiers  pour la compilation. Il y a deux  lignes, donc deux  fichiers  inclus. Ces  fichiers  s'appellent  stdio.h et  stdlib.h.  Ces  fichiers  existent d√©j√†, des fichiers source tout pr√™ts. On verra plus  tard qu'on les  appelle des  biblioth√®ques. En gros, ces  fichiers  contiennent  du code tout  pr√™t  qui permet  d'afficher du texte √† l'√©cran.

*  int main()  {  ..............    }
Cette fonction s'appelle la fonction  main. C'est  un nom  de fonction particulier qui  signifie « principal  ». main est  la fonction principale de votre programme, c'est toujours  par la fonction main que le programme commence. Une fonction a un d√©but  et  une fin, d√©limit√©s par des accolades{ et }. Toute la fonction main  se trouve donc entre ces accolades. 

*   printf("Hello world!\n") ;     
      return 0 ;
Ces lignes √† l'int√©rieur d'une fonction s’appellent  instructions, Chaque instruction est une  commande √† l'ordinateur. Chacune de ces  lignes  demande √† l'ordinateur de faire quelque chose. Par exemple la premi√®re demande par l’ordinateur  d’afficher le message Hello world!  √† l'√©cran, puis  passer √† l'instruction suivante  return 0 ; . Cette ligne indique qu'on arrive  √† la fin de notre fonction main et demande de renvoyer la valeur 0. 


Pourquoi  mon programme retourne le nombre 0 ?
En fait, chaque programme une fois  termin√© renvoie une valeur, par exemple pour dire que tout  s'est  bien pass√©. En pratique, 0 signifie « tout  s'est  bien pass√© » et  n'importe quelle autre valeur signifie « erreur ». La plupart  du temps, cette valeur n'est  pas vraiment  utilis√©e, mais  il  faut  quand m√™me en renvoyer une. Votre programme aurait  march√© sans  le return 0, mais  on va dire que c'est  plus  propre et  plus  s√©rieux  de le mettre, donc on le met.

!! Tr√®s  important: toute instruction se termine obligatoirement par un point-virgule « ; ». Si  vous  oubliez  de mettre un point -virgule √† la fin d'une  instruction, votre programme ne  compilera pas !. 

* √Čcrire  un message  √† l'√©cran
√Ä partir de maintenant, on va modifier nous -m√™mes  le code de ce programme minimal. Qui permet d’afficher le message « Bonjour » √† l'√©cran.       "Essayez" 



Cours en langage C


* Les  caract√®res  sp√©ciaux
Les  caract√®res  sp√©ciaux  sont  des  lettres  sp√©ciales  qui  permettent  d'indiquer qu'on veut aller √† la ligne, faire une tabulation, etc. Ils  sont  faciles  √† reconna√ģtre : c'est  un ensemble de deux  caract√®res. Le premier d' entre eux  est  toujours  un    anti-slash ( \ ), et  le second un nombre ou une lettre. Voici  deux  caract√®res   sp√©ciaux  courants  que vous  aurez  probablement  besoin d'utiliser, ainsi que leur signification:

\n :   retour √† la ligne « Entr√©e » ;
\t :   tabulation.
Dans  notre cas, pour faire une entr√©e, il  suffit  de taper \n pour cr√©er un retour √† la ligne. Si  je veux  donc faire une tabulation, je devrais  taper \t.

* Les  commentaires
Lorsqu'un programme devient long, il est conseill√© d’ajouter des lignes de commentaires dans le programme, c’est-√†-dire des lignes qui ont pour but de donner des indications sur les instructions effectu√©es et d’expliquer le fonctionnement de programme  sans que le compilateur ne les prenne en compte. 
On va voir  deux  types de commentaires :

Commentaire sur une ligne :     
 // un commentaire 

Commentaire sur plusieurs lignes :   

Remarque : Parfois on utilise les commentaires pour annuler l’action de quelques instructions dans  un programme au lieu de les effacer  comme dans cet exemple :


Cours en langage C


Le programme  ignore  l’instruction qui se trouve  entre  le commentaire  et affiche seulement Bonjour .

2) Les variables et les constantes 
2-1) Notion de variable
Les donn√©es  ainsi que les r√©sultats des calculs interm√©diaires ou finaux, sont rang√©s dans des cases m√©moires qui correspondent √† des variables, Ainsi, une variable  est rang√©e dans un emplacement m√©moire nomm√©, de taille fixe (ou non) prenant au cours du d√©roulement de programme un nombre ind√©fini de valeurs diff√©rentes. 


2-2) d√©claration des variables 
La partie d√©claration consiste √† √©num√©rer toutes les variables dont on aura besoin  au cours de programme. Chaque d√©claration doit comporter le nom de variable (identificateur) et son type.
Syntaxe :     type   identificateur  ;

Identificateur : Un identificateur est le nom donn√© √† une variable. Ce  nome doit obligatoirement  commencer par une lettre suivie d’une suite de  lettres et les chiffres et il ne doit pas contenir d’espace.
Types de donn√©es :
Le type de variable est l’ensemble des valeurs qu’elle peut prendre.
int : sert √† manipuler les nombres entiers positifs ou n√©gatifs. 
Par exemple : 5  , 20 , -4
float :  sert √† manipuler les nombres √† virgule. Par exemple : 5.0 ,  2.1,  -1.278
char :  sert √† manipuler des caract√®res, Par exemple :   'A'   ,  '6'

Exemple :  
 int N ;          
float  e , r  ;                        
char   letter ;


Les op√©rations sur des variables :



2-3) Les constantes
Comme une variable, il existe une  constante  correspond un emplacement m√©moire r√©serv√© auquel on acc√®de par le nom qui lui a √©t√© attribu√©, mais dont la valeur stock√©e ne sera jamais modifi√©e au cours du programme.

Syntaxe :     
const  Nom_Constante = valeur ;   
Exemple :    const   float pi = 3.14 ;

3) Les instructions de base    
Une instruction est une  action √©l√©mentaire commandant √† la machine un calcul, ou une communication avec l’un de ses p√©riph√©riques d’entr√©es  ou de sorties. Les instructions de base sont :

3-1) L’instruction d’affectation :
L’affectation permet d’affecter une valeur √† une variable. Elle est symbolis√©e par =
Syntaxe :       Variable   =  Expression ;
Exemple :

int N = 6 ;     
float  e = 2.56 ;               
char   letter = 'A' ;  



3-2) L’instruction d’entr√©e :
L’instruction d’entr√©e ou de lecture donne la main √† l’utilisateur pour saisir une donn√©e au clavier. La valeur saisie sera affect√©e √† une variable. Cette instruction est  effectu√©e via la fonction scanf . Vous  devez  mettre un format  pour indiquer ce que l'utilisateur doit entrer    (un int, un float, ...). Puis  vous  devez  ensuite indiquer le nom  de la variable pr√©c√©d√© par le  symbole & (signifie l’adresse de cette variable)  qui  va recevoir  le nombre. 
Exemple :             scanf("%d", &age ) ;

!! On doit  mettre le  %d entre guillemets.

Par ailleurs, il  faut  mettre le symbole  &  devant  le nom  de la variable qui  va recevoir la valeur.

4-3) L’instruction de sortie :
Avant de lire une variable, il est conseill√© d’√©crire un message √† l’√©cran, afin de pr√©venir l’utilisateur de ce qu’il doit taper.
L’instruction de sortie (d’√©criture) permet d’afficher des informations  √† l’√©cran.

Syntaxe:  
printf ("message √† l'√©cran");    

Exemple: 
printf (" Entrer votre email : ") ;  
Remarque
Pour afficher la valeur d’une variable √† l’√©cran  on ajoute un symbole sp√©cial √† l’endroit o√Ļ l’on veut afficher la valeur de cette variable.  .      
 int  (%d )     float   (%f  )     char ( % c)  


Exemple :                 
 printf (" Votre √Ęge est %d ans  ", age) ;


les exercices en langage C


        *** Chapitre 2 : Les  structures alternatives et r√©p√©titives *** 

1) Les structures alternatives 
1-1) Introduction :
Contrairement  au traitement s√©quentiel, la structure alternative ou conditionnelle permet d’ex√©cuter ou non une s√©rie d’instructions selon la valeur d’une condition.
1-2)  La structure    if {}   ou    if {} else {}
Syntaxe : 



Une condition est une expression  logique  ou une variable logique √©valu√©e √†  Vrai ou faux. La condition est √©valu√©e. Si  elle est vraie, la s√©rie d’instruction(s)1 est ex√©cut√©e et   l’ensemble d’instruction(s) 2 est ignor√©, la machine sautera directement √† la premi√®re instruction situ√©e  apr√®s cette structure.
De  m√™me, au cas o√Ļ la condition  √©tait fausse la machine saute directement √† la premi√®re ligne situ√©e apr√®s le  else et ex√©cute l’ensemble d’instruction2.

Exercice d’application 1
Ecrire un programme  qui affiche si un nombre entier  saisi au clavier est pair ou impair.


Cours en langage C



Remarque : il existe aussi un autre type de condition c’est la condition compos√©es.
Certains probl√®mes exigent  de formuler des conditions qui ne peuvent √™tre exprim√©es sous la forme simple, par exemple la condition  de  note  de devoir doit √™tre inclus dans  l’intervalle [0, 20],  cette  condition est compos√©e de deux conditions simples qui  sont   note 0    et   note 20

Exercice d’application 2
Ecrire  un programme qui permet de faire  une remarque d’une note saisi au clavier ( si la note sup√©rieur  √† 10  alors on affiche  valid√© sinon non valid√©  (NB : la note comprise entre 0 et 20 ! )

les exercices en langage C




Exercice 1:
Ecrire un programme  qui demande deux nombres m et n √†  l’utilisateur et l’informe ensuite si le produit  de ces deux nombres est positif ou n√©gatif. On inclut   dans le programme  le cas  o√Ļ le produit peut √™tre nul.



Cours en langage C


Exercice 2:
Une boutique propose √† ces clients, une r√©duction de 15% pour les montants d’achat sup√©rieurs √† 200 dh. Ecrire un programme permettant de saisir le prix total HT et de calculer le montant TTC en prenant en compte la r√©duction et la TVA=20%.


Cours en langage C



1-3) Structure à choix multiples (Switch)
La condition  if... else  que l'on vient de voir est le type de condition le plus souvent utilis√©. Toutefois, le  if... else  peut s'av√©rer quelque peu… r√©p√©titif : Prenons cet exemple : 



Pour r√©soudre ce probl√®me de la r√©p√©tition de  if  else   if  else …. plusieurs fois. On utilise une nouvelle structure  √† choix multiples. Cette  structure conditionnelle permet de choisir le traitement √† effectuer en fonction  de la valeur ou de l’intervalle de valeurs d’une variable ou  d’une expression.

Syntaxe :  


Lorsque l’ordinateur rencontre cette instruction, il v√©rifie la valeur de la variable, et il la compare  aux diff√©rentes valeurs.  
Les valeurs sont √©valu√©es  dans l’ordre, les unes apr√®s les autres, et une fois la valeur de variable  est v√©rifi√©e l’action associ√©e  est ex√©cut√©e. On peut utiliser une instruction default  (facultative), dont l’action sera ex√©cut√©e si aucune des valeurs √©valu√©es n’a pas √©t√© remplie.

Exercice d’application :
Ecrire un programme  permettant d’afficher le mois en lettre selon le  num√©ro saisi  au clavier  (janvier=1  ,  f√©vrier =2  …….. d√©cembre = 12).



les exercices en langage C



Remarque : Vous devez mettre une instruction break ;   √† la fin de chaque cas. Pour ignorer les  instructions en dessous ! L'instruction break ;  commande en fait √† l'ordinateur de « sortir » des accolades. Et  instruction  defaulf ;   sera ex√©cut√©e si aucune des valeurs  √©valu√©es n’a pas √©t√© remplie.

2) Les Structures  r√©p√©titives 
2-1) Introduction
Prenons d’une saisie au clavier, par exemple, on pose une question √† laquelle doit r√©pondre par  « oui » ou « non ». 
L’utilisateur risque de taper autre chose (une autre lettre), le programme peut soit planter par  une erreur d’ex√©cution soit d√©rouler normalement jusqu'au bout, mais en produisant des  r√©sultats fantaisistes.
Pour √©viter ce probl√®me, on peut mettre en place un contr√īle de saisie pour v√©rifier que les donn√©es entr√©es au clavier correspondent bien √† celles attendues par le programme.



!!! Le programme  ci-dessus r√©sout le probl√®me si on se trompe qu’une  seule fois, et on fait entrer une valeur correcte √† la deuxi√®me demande. Sinon en cas de deuxi√®me  erreur, il faudrait rajouter un  «  if  ». Et ainsi de suite, on peut rajouter des  centaines  de  «  if  » 

* La solution √† ce probl√®me consiste √† utiliser une structure r√©p√©titive.
Une structure r√©p√©titive, encore appel√©e boucle, est utilis√©e quand une instruction ou une liste d’instruction, doit √™tre r√©p√©t√©e plusieurs fois. La r√©p√©tition est soumise √† une condition.

 
2-2) La boucle while
La boucle while  permet de r√©p√©ter un traitement tant que la condition est vraie.

Syntaxe :   



==> L’ex√©cution de la boule d√©pend de la valeur de la condition. Si est vrai, le programme ex√©cute les instructions qui suivent, jusqu’√† ce qu’il  rencontre la accolade  }. Il retourne ensuite sur la ligne du while, proc√®de au m√™me examen, et ainsi de suite.
==> La boucle ne s’arr√™te que lorsque prend la valeur fausse, et dans ce cas le programme poursuit son ex√©cution apr√®s  la boucle  « sortir des accolades ».

Exemple:




Remarque :  Si la  structure   while   contient la condition ne devient jamais fausse. Le programme tourne dans une boucle infinie et n’en sort plus.


Exemple :
Dans cet exemple nous avons  une boucle infinie. L’ordinateur ne s’arr√™tera jamais d’afficher le message Bonsoir  car la variable i qui est test√©e dans la condition n’est jamais incr√©menter. Alors pour  r√©soudre  le probl√®me de boucle infinie dans ce cas-l√†, on incr√©mente la variable i √† chaque tour de boucle  pour afficher   Bonsoir  10 fois exactement.  


les exercices en langage C

Exercice 1
Ecrire un programme  qui calcule la somme  S = 1+2+3+4+……..+ 10. Utilisant la boucle while.


les exercices en langage C



Exercice 2 
Ecrire un programme qui calcule la somme   S= 1+2+3+4+……..+ N,  o√Ļ N saisi par l’utilisateur. 

les exercices en langage C



2-3)  La boucle  for

La boucle  for  permet de r√©p√©ter une liste d’instructions un nombre connu de fois.
Syntaxe :


Exemple:

      
Cet exemple  permet d’afficher le message bonjour 10  fois, et tant que la condition est vraie la boucle r√©p√®te l’ex√©cution des instructions qui se trouvent  entre les accolades. 
==> La partie d’initialisation  est de type entier. Elle est initialis√©e par la valeur initiale, la partie instruction(s) augmente cette valeur par  1 automatiquement √†  chaque tour de  boucle  jusqu'√† la valeur finale.
==> Lorsque la valeur compteur vaut la valeur finale, le traitement est ex√©cut√© une seule  fois puis le programme sort de la boucle.

Exemple:

les exercices en langage C


Exercice 1 
Ecrire un programme  qui calcule   S=1+2+3+….+ 10. Utilisant la boucle for.

les exercices en langage C



Exercice 2   
Ecrire un programme qui calcule  S=1+2+3+…+ N. Utilisant la boucle for.


Cours en langage C
    
Exercice 3
Ecrire un programme  qui affiche la table de multiplication de 5. Utilisant la boucle for.


Cours en langage C


Exercice 4
Ecrire un programme qui affiche la table de multiplication d’un  entier saisie par l’utilisateur, Utilisant la boucle for.



Cours en langage C


2-4) La  boucle   do ….While
Cette boucle permet de r√©p√©ter les instructions qui se trouvent entre les accolades tant que la condition est vraie.
Remarque : Cette boucle ne s’utilise en g√©n√©ral que pour des menus, elle est dangereuse car il  n’y a pas de v√©rification de la condition avant  d’y entrer.
Ce type de boucle est  tr√®s  similaire √† while, bien qu’un peu moins  utilis√© en g√©n√©ral.
La seule chose qui  change en fait  par rapport  √† while, c'est  la position de la condition.  Au li eu  d'√™tre au d√©but  de la boucle, la condition est  √† la fin:


Syntaxe : 


la boucle while  pourrait  tr√®s  bien ne jamais  √™tre ex√©cut√©e si  la condition est  fausse d√®s  le d√©part. Par exemple, si la condition est fausse  d√®s  le d√©but  et  on ne serait  jamais  rentr√©   dans  la boucle. et Pour la boucle do… while, c'est  diff√©rent: cette boucle s'ex√©cutera toujours  au moins  une fois m√™me si la condition est fausse.
 
Il  est  donc  parfois  utile de faire des  boucles  de ce type, pour s'assurer que l'on rentre au moins  une fois  dans  la  boucle. 

!!!  N'oubliez  pas  de mettre un point-virgule  apr√®s  le while, si non votre programme plantera √† la compilation !

Exemple:
En utilisant  la boucle do…..while, on √©crit  un programme  qui affiche Bonjour 10 fois.


Cours en langage C



Exercice 1
Ecrire un programme qui calcule la somme  S= 1+2+3+…+ 10. Utilisant la boucle  do…..while.
Cours en langage C


Exercice 2
Ecrire un programme  qui affiche la table de multiplication de 5. Utilisant la boucle  do …. While.


Cours en langage C



  Chapitre 3: Les Tableaux                          

1) Introduction
Imaginons que dans un algorithme, nous avons besoin d’un grand nombre de variables, il devient difficile de donner un nom pour chaque variable.
Exemple :
Ecrire un programme  permettant de saisir  cinq notes et de les afficher apr√®s avoir multipli√© toutes les notes par trois.



==> La m√™me instruction r√©p√®te  cinq fois. Imaginons que  si l’on voudrait r√©aliser ce programme  avec 100 notes, cela devient tr√®s difficile.
==>  Pour r√©soudre ce probl√®me, il existe un type de donn√©es qui permet de d√©finir plusieurs variables de m√™me type.
 

2) Définition
Un tableau est une suite d’√©l√©ments de m√™me type. Il utilise plusieurs  cases m√©moire √† l’aide d’un seul nom. Comme toutes les cases portent le m√™me nom, elles se diff√©rencient par un num√©ro  ou un indice. 
Nous pouvons repr√©senter sch√©matiquement un tableau nomm√© Note compos√© de cinq cases, dans la m√©moire comme suit :



3) Tableau à une dimension
3-1) D√©claration 
La d√©claration d’un tableau permet d’associer √† un nom d’une zone m√©moire compos√©e d’un certain nombre de cases m√©moires de m√™me type.  
Syntaxe :     type     nom_tableau[taille_max] ;
Exemple :   float   Notes[40] ;

Remarques : 
==> Le premier √©l√©ment d’un tableau porte l’indice  0 .
==>  La valeur d’un indice doit √™tre un nombre entier
==> La valeur d’un indice doit  √™tre inf√©rieure ou √©gale au nombre d’√©l√©ments du tableau. Par exemple, avec le tableau tab[20], il est impossible d’√©crire  tab[21] ou tab[26], ces expressions font r√©f√©rence √† des √©l√©ments qui n’existe pas.
==> L’utilisation de ces √©l√©ments  se fait en suite, via le nom du tableau et son indice. Ce  dernier peut √™tre soit une valeur (tab[3]  ) , soit une variable ( tab [i] ) ou encore une expression ( tab[i+1] ).  

==> Pour Faire un parcours complet sur un tableau, on utilise une boucle.

Exercice 1
Ecrire un programme  permettant de saisir  20 notes et de les stocker dans un tableau nomm√© Etudiant, puis les afficher.




 


Exercice 2 : Ecrire un programme  permettant de saisir  20 notes et de les afficher 
apr√®s avoir multipli√© toutes ces notes par un coefficient fourni par l’utilisateur.
         





















Exercice 3

Ecrire un programme permettant de saisir 12 notes et qui affiche la moyenne de ces notes.



       

















Exercice 4
Ecrire un programme permettant de saisir 12 notes et qui affiche le maximum de ces notes.





  

 
















Exercice 5
Ecrire un programme  qui demande √† l’utilisateur de taper 10 entiers qui seront stock√©s dans un tableau. Le programme doit trier le tableau par ordre  croissant et doit afficher le tableau. 





























Exercice 6




























4) Tableau à deux dimensions
Reprenons l’exemple des notes en consid√©rant  cette fois qu’un √©tudiant a plusieurs notes (une note pour chaque mati√®re). On peut simplifier des choses comme suite.






==> Les tableaux √† deux dimensions se repr√©sentent comme une matrice ayant un certain nombre de lignes (premi√®re dimension) et un certain nombre de colonne (seconde dimension). 
4-1) Déclaration
  Type  Nom_Tableau [nb_lignes][ nb_colonnes]  ;
     Exemple :    float  Tableau[3][4] ;

Remarques:
==>  L’utilisation d’une matrice  se fait via son nom  et ses indices. Ces derniers  peuvent √™tre soient des valeurs (tab[1][3]  ) , soient des  variables   ( tab [i][j] ) ou encore des expressions ( tab[i+1][j] ).
==> Pour Faire un parcours complet sur une matrice, on utilise deux boucles, l’une au sein de l’autre, c’est ce qu’on appelle  les boucles imbriqu√©es. La premi√®re boucle pour  parcourir les lignes tandis que la deuxi√®me est utilis√©e pour parcourir les √©l√©ments de la ligne pr√©cis√©e par la boucle principale (la premi√®re boucle).
Exemple :
Ecrire un programme  permettant de saisir  les  notes  d’une classe de 30 √©tudiants en 5 mati√®res.

 





          






    chapitre 4 : Les Pointeurs  
1) Introduction   
La plupart des langages de programmation offrent la possibilit√© d'acc√©der aux donn√©es dans la m√©moire de l'ordinateur √† l'aide de pointeurs, c’est-√†-dire. √† l'aide de variables auxquelles on peut attribuer les adresses d'autres variables. 

En C, les pointeurs jouent un r√īle principal  dans la d√©finition de fonctions: Comme le passage des param√®tres en C se fait toujours par la valeur, les pointeurs sont le seul moyen de changer le contenu de variables d√©clar√©es dans d'autres fonctions. Ainsi le traitement de tableaux et de cha√ģnes de caract√®res dans des fonctions serait impossible sans l'utilisation de pointeurs.
En outre, les pointeurs nous permettent d'√©crire des programmes plus compacts et plus efficace et fournissent souvent la seule solution raisonnable √† un probl√®me. Ainsi, la majorit√© des applications √©crites en C profitent extensivement des pointeurs.

 2) Adressage de variables 
Avant de parler de pointeurs, il est indiqu√© bri√®vement  les deux modes d'adressage principaux, qui vont d'ailleurs nous accompagner tout au long des chapitres suivants.

2-1) Adressage direct
Dans la programmation, nous utilisons des variables pour stocker des informations. La valeur d'une variable  se trouve √† un endroit sp√©cifique dans la m√©moire interne de l'ordinateur. Le nom de la variable nous permet alors d'acc√©der directement √† cette valeur.

 Exemple:     Int  A=12 ;






2-2) Adressage indirect
Si nous ne voulons ou ne pouvons pas utiliser le nom d'une variable A, nous pouvons copier l'adresse de cette variable dans une variable sp√©ciale P, appel√©e pointeur. Ensuite, nous pouvons retrouver l'information de la variable A en passant par le pointeur P. ce dernier contient l'adresse de variable A.

Exemple : 
Soit A une variable contenant la valeur 10  et  P un pointeur qui contient l'adresse de A. En m√©moire, A et P peuvent se pr√©senter comme suit:

 








 3) Les pointeurs 

Un pointeur est une variable sp√©ciale qui peut contenir l'adresse d'une autre variable En C,  chaque pointeur est limit√© √† un type de donn√©es. Il peut contenir l'adresse d'une variable simple de ce type ou l'adresse d'une composante d'un tableau de ce type.
si un pointeur P contient l'adresse d'une variable A, on dit que  P pointe sur A.

Remarque :
Les pointeurs et les noms de variables ont le m√™me r√īle: Ils donnent acc√®s √† un emplacement dans la m√©moire interne de l'ordinateur. Il faut quand m√™me bien faire la diff√©rence:
*Un pointeur est une variable qui peut "pointer" sur diff√©rentes adresses
*Le nom d'une variable reste toujours li√© √† la m√™me adresse

2-1) Les op√©rateurs de base 

Lors du travail avec des pointeurs, nous avons besion
==> d'un opérateur "adresse de " : & pour obtenir l'adresse d'une variable.
==> d'un opérateur " contenu de " : * pour accéder au contenu d'une adresse.
==> d'un syntaxe de déclaration : pour déclarer un pointeur.

L'op√©rateur "adresse de" :    & NomVariable    permet de fournir  l'adresse de la variable  NomVariable

Exemple :

p  = &A ; cette instruction  permet  d’affecter  l’adresse de variable A  √†  la variable p.







&A :  signifie l’adresse  de variable A (E0H5),  et aussi le contenu de variable  p.

printf(" l’adresse de A est %d ", p) ;    ou         printf("l’adresse de A est %d ", &A) ;

Le message qui va afficher sur l’√©cran est  ceci :   l’adresse de A est  E0H5 .


L'op√©rateur "contenu de":   * <NomVariable>    d√©signe le contenu de l'adresse r√©f√©renc√©e par le pointeur <NomPointeur>.
Exemple :

*p : signifie le contenu de l'adresse r√©f√©renc√©e par le pointeur, dans ce cas-l√†  c’est la valeur de variable A  (10).

printf("le contenu de A est %d ", A) ;   ou      printf("le contenu de A est %d ", *p) ;

Le message qui va afficher sur l’√©cran est  ceci :  le contenu de A est : 10.

D√©claration d'un pointeur : 
Type  *  NomPointeur  ;   

Cette instruction permet de d√©clarer  un pointeur <NomPointeur> qui peut recevoir des adresses de variables du  type  <Type>.

Exemples :           int * P ;                float * P ; 

Exemple d’application





























 4) Pointeurs et tableaux

4-1) introduction                                                                           

En C, il existe une relation tr√®s √©troite entre tableaux et pointeurs. Ainsi, chaque op√©ration avec des indices de tableaux peut aussi √™tre exprim√©e √† l'aide de pointeurs. En g√©n√©ral, les versions formul√©es avec des pointeurs sont plus compactes et plus efficientes, surtout √† l'int√©rieur de fonctions. Mais, du moins pour des d√©butants, le 'formalisme pointeur' est un peu inhabituel .

4-2) Adressage des √©l√©ments  d'un tableau 
On d√©finit le  nom d'un tableau  comme  l'adresse de son premier √©l√©ment. En d’autres termes:  &tableau[0] et tableau    sont une seule et m√™me adresse.
En simplifiant, nous pouvons retenir que le nom d'un tableau est un pointeur constant sur le premier √©l√©ment du tableau.
Exemple :








Pour obtenir l’adresse du premier  √©l√©ment  du tableau:
==> L’expression  tableau  signifie l’adresse du premier √©l√©ment du tableau, alors elle contient 8767
==> L’expression  &tableau [0] signifie l’adresse du premier √©l√©ment du tableau, c’est-√†-dire  8767 

Pour obtenir  l’adresse du  deuxi√®me √©l√©ment  du tableau  on incr√©mente   par  1
==L’expression  tableau +1  signifie l’adresse du deuxi√®me  √©l√©ment du tableau, c’est-√†-dire  8768
==>  L’expression  &tableau [1] signifie l’adresse du premier √©l√©ment du tableau, c’est-√†-dire  8768

Pour obtenir  l’adresse du  i √®me  √©l√©ment du tableau 
==> L’expression  tableau + i  signifie l’adresse du deuxi√®me  √©l√©ment du tableau, c’est-√†-dire  8767 + i
==> L’expression  &tableau [i] signifie l’adresse du premier √©l√©ment du tableau, c’est-√†-dire  8767 + i 

Pour obtenir la  valeur  du premier √©l√©ment  du tableau


 ==L’expression * tableau  signifie  la valeur du premier √©l√©ment du tableau, alors elle contient  5

 ==L’expression  &tableau [0] signifie la valeur  du premier √©l√©ment du tableau, c’est-√†-dire  5

Pour obtenir  la valeur  du  deuxi√®me √©l√©ment  du tableau, on incr√©mente   par  1 
 ==>  L’expression *(tableau +1)  signifie l’adresse du deuxi√®me  √©l√©ment du tableau, c’est-√†-dire  2
==L’expression  tableau [1] signifie l’adresse du premier √©l√©ment du tableau, c’est-√†-dire  2

En r√©sume :
Le nom d'un tableau est un pointeur constant sur le premier √©l√©ment du tableau. 
Les deux expressions &tableau[0] et tableau    sont  √©quivalents.

Exercice  d’application
Ecrire un programme  permettant de saisir  5 entiers  et de les stocker dans un tableau nomm√©  tableau, puis les afficher.  (NB. utiliser la notion de pointeur !!!!) 























Exercice 1
Soit P un pointeur qui 'pointe' sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;     P = A;
Quelles valeurs ou adresses fournissent ces expressions:

a)    *P+2 
b)    *(P+2)     
c)    &P+1 
d)    &A[4]-3    
e)    A+3        
f)    1+(*P-10)  
g)    *(P + *(P+8)-A[7])

 solution 

a) 14
b) 34
c) l’adresse du 2√©me √©lement du tableau
d) l’adresse du 2√©me √©lement du tableau
e) l’adresse du 4√©me √©lement du tableau
f) 3
g) 23

Exercice 2
Ecrire un programme qui range les √©l√©ments d'un tableau A du type int dans l'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une variable num√©rique AIDE pour la permutation des √©l√©ments.