Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2491 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pointeur

n°2268831
caza25
Posté le 30-10-2015 à 00:54:49  profilanswer
 

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
 
 

mood
Publicité
Posté le 30-10-2015 à 00:54:49  profilanswer
 

n°2268836
Trap D
Posté le 30-10-2015 à 09:12:41  profilanswer
 

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.

n°2268852
kao98
...
Posté le 30-10-2015 à 11:31:43  profilanswer
 

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
n°2268862
gilou
Modérateur
Modzilla
Posté le 30-10-2015 à 12:40:33  profilanswer
 

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é!  --
n°2268867
caza25
Posté le 30-10-2015 à 15:15:52  profilanswer
 

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 :)  

n°2268884
gilou
Modérateur
Modzilla
Posté le 30-10-2015 à 17:17:23  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pointeur

 

Sujets relatifs
Pointeur intelligent et singleton [résolu][Resolu][VBA]pointeur sur une sous-feuille dans un sous formulaire
Aide sur une fonction retournat un pointeur sur char. MerciPointeur sur tableau de structure
tableau de pointeur sur structure dans une structuredéclaration d'un vector de pointeur
Différence entre pointeur de pointeur et vector de pointeurvecteur de vecteur ou pointeur de pointeur
Comment récupérer la forme du pointeur souris n'importe où sous windowpointeur de tableau 2D d'entiers...
Plus de sujets relatifs à : Pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR