Pointeur

Pointeur - C - Programmation

Marsh Posté le 30-10-2015 à 00:54:49    

Bonsoir,
je débute en C, je suis actuellement au chapitre sur les pointeurs, voici un exemple de programme :

Code :
  1. void fonction(int *pointeur_du_nombre);
  2. int main()
  3. {
  4.   int nombre=5;
  5.   fonction(&nombre);
  6.   printf("%d",nombre);
  7.   return 0;
  8. }
  9. void fonction(int *pointeur_du_nombre)
  10. {
  11.   *pointeur_du_nombre*=3;
  12. }


 
Donc de ce que j'ai compris, ce programme multiplie par 3 la variable nombre, mais je ne comprends pas pourquoi.
Pour moi ce programme fait donc :  
dans la fonction, " *pointeur_du_nombre " ceci correspond à une adresse, ce serai cette adresse qui serai multiplié par 3 et non la valeur que cette adresse représente.
Pouvez vous m'éclaicir sur ce point ? Merci
 
 

Reply

Marsh Posté le 30-10-2015 à 00:54:49   

Reply

Marsh Posté le 30-10-2015 à 09:12:41    

Il ne faut pas confondre la déclaration dans le nom de la fonction int *pointeur_du_nombre qui dit que pointeur_du_nombre est une adresse et *pointeur_du_nombre dans le corps de la fonction qui prend la valeur pointée par l'adresse pointeur_du_nombre.
Ais-je été clair ?
 *pointeur_du_nombre*=3; signifie que le nombre pointé par l'adresse  pointeur_du_nombre est multiplié par 3.

Reply

Marsh Posté le 30-10-2015 à 11:31:43    

Ouais, voilà.
 
Pour t'en assurer, tu peux faire quelque chose comme ça :
 

Code :
  1. void fonction(int *pointeur_du_nombre)
  2. {
  3.   printf("Adresse : %d\nValeur : %d", pointeur_du_nombre, *pointeur_du_nombre);
  4.   *pointeur_du_nombre*=3;
  5. }


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 30-10-2015 à 12:40:33    

Quand tu fais ceci,  
fonction(&nombre);
tu passes à fonction l'adresse de la variable nombre de type entier.
Maintenant, pour que ça marche, il faut que fonction accepte comme paramètre l'adresse d'une variable de type entier.
Et en C, qui est un langage très primitif, il n'y a pas moyen de dire "je définis une fonction qui accepte comme paramètre l'adresse d'une variable de type entier" (des langages plus évolués le permettent), alors, il faut ruser:
En C, une variable pointeur sur le type int, int *toto, c'est une variable toto, dont la valeur est l'adresse d'une zone contenant un certain nombre d'entiers. Et nous, ce qu'on veut passer, c'est l'adresse d'une zone contenant un (seul) entier. C'est donc compatible, et c'est ce qu'on va utiliser faute de mieux:
en déclarant void fonction(int *pointeur_du_nombre);
on va pouvoir utiliser fonction en lui passant l'adresse de nombre, fonction(&nombre) sans que le compilateur y trouve à redire.
Et quand dans la fonction, je vais travailler sur la valeur pointée, *pointeur_du_nombre, c'est que je considère que pointeur_du_nombre est l'adresse d'une zone contenant un certain nombre d'entiers, et que *pointeur_du_nombre est le premier entier de la zone (le second serait *(pointeur_du_nombre+1))
Donc si pointeur_du_nombre vaut &nombre, le premier entier de la zone sera la valeur de nombre (et si je modifie *pointeur_du_nombre, alors je modifie aussi la valeur de nombre)
 
Pourquoi fais t-on ceci fonction(&nombre) et non pas fonction(nombre)?
Parce que le langage C est primitif, quand on fait fonction(toto); on copie la valeur de toto, et on travaille sur la copie (en oubliant d'ou elle vient).
Quand le fonction est terminée, c'est la copie qui a été modifiée, mais pas l'original.
quand on fait fonction(&toto); on copie la valeur de &toto, et on travaille sur la copie (en oubliant d'ou elle vient).
Mais cette copie a toujours pour valeur l'adresse de toto, et donc au final ce sera toujours toto qui sera modifié par la fonction.
 
Donc on passe par adresse quand on veut une fonction qui modifie les valeurs des variables passées, et on passe par valeur quand on ne veut pas de modification des valeurs des variables passées.
 
Un autre de cas de figure de passage par adresse, c'est quand on veut passer quelque chose de gros à une fonction: copier quelque chose de gros c'est long, juste copier son adresse, c'est rapide.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-10-2015 à 15:15:52    

Merci beaucoup pour vos réponses, j'y vois plus clair !
 
Donc enfaîte ici : void fonction(int *pointeur_du_nombre)
le fait de mettre * sert à indiquer que la fonction attend une valeur de type pointeur mais si je veux retrouver ce pointeur plus tard c'est en demandant  pointeur_du_nombre et non *pointeur_du_nombre.
Et donc *pointeur_du_nombre correspond à la valeur pointée.
 
Merci bien :)  

Reply

Marsh Posté le 30-10-2015 à 17:17:23    

Oui:
int *pointeur_du_nombre
*pointeur_du_nombre est un int et donc pointeur_du_nombre est un pointeur sur un/des int(s)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed