Envoyer un pointeur à une fonction 




Le gros intérêt des pointeurs (mais ce n'est pas le seul) est qu'on peut les envoyer à des fonctions pour qu'ils modifient directement une variable en mémoire, et non une copie comme on l'a vu.

Comment ça marche ? Il y a en fait plusieurs façons de faire. Voici un premier exemple :

void triplePointeur(int *pointeurSurNombre);

  

int main(int argc, char *argv[])

{

    int nombre = 5;

   

    triplePointeur(&nombre); // On envoie l'adresse de nombre à la fonction

    printf("%d", nombre); // On affiche la variable nombre. La fonction a directement modifié la valeur de la variable car elle connaissait son adresse

        

    return 0;

}

       

void triplePointeur(int *pointeurSurNombre)

{

    *pointeurSurNombre *= 3; // On multiplie par 3 la valeur de nombre

}




15




La fonction triplePointeur prend un paramètre de type int* (c'est-à-dire un pointeur sur int). Voici ce qu'il se passe dans l'ordre, en partant du début du main :

  1. une variable nombre est créée dans le main. On lui affecte la valeur 5. Ça, vous connaissez ;
  2. on appelle la fonction triplePointeur. On lui envoie en paramètre l'adresse de notre variable nombre ;
  3. la fonction triplePointeur reçoit cette adresse dans pointeurSurNombre. À l'intérieur de la fonction triplePointeur, on a donc un pointeur pointeurSurNombre qui contient l'adresse de la variable nombre ;
  4. maintenant qu'on a un pointeur sur nombre, on peut modifier directement la variable nombre en mémoire ! Il suffit d'utiliser *pointeurSurNombre pour désigner la variable nombre ! Pour l'exemple, on fait un simple test : on multiplie la variable nombre par 3 ;
  5. de retour dans la fonction main, notre nombre vaut maintenant 15 car la fonction triplePointeur a modifié directement la valeur de nombre.

Bien sûr, j'aurais pu faire un simple return comme on a appris à le faire dans le chapitre sur les fonctions. Mais l'intérêt, là, c'est que de cette manière, en utilisant des pointeurs, on peut modifier la valeur de plusieurs variables en mémoire (on peut donc « renvoyer plusieurs valeurs »). Nous ne sommes plus limités à une seule valeur !

Quel est l'intérêt maintenant d'utiliser un return dans une fonction si on peut se servir des pointeurs pour modifier des valeurs ?



Ça dépendra de vous et de votre programme. C'est à vous de décider. Il faut savoir que les return sont bel et bien toujours utilisés en C. Le plus souvent, on s'en sert pour renvoyer ce qu'on appelle un code d'erreur : la fonction renvoie 1 (vrai) si tout s'est bien passé, et 0 (faux) s'il y a eu une erreur pendant le déroulement de la fonction.

Une autre façon d'envoyer un pointeur à une fonction



Dans le code source qu'on vient de voir, il n'y avait pas de pointeur dans la fonction main. Juste une variable nombre. Le seul pointeur qu'il y avait vraiment était dans la fonction triplePointeur (de type int*).

Il faut absolument que vous sachiez qu'il y a une autre façon d'écrire le code précédent, en ajoutant un pointeur dans la fonction main :

void triplePointeur(int *pointeurSurNombre);

      

int main(int argc, char *argv[])

{

    int nombre = 5;

    int *pointeur = &nombre; // pointeur prend l'adresse de nombre

     

    triplePointeur(pointeur); // On envoie pointeur (l'adresse de nombre) à la fonction

    printf("%d", *pointeur); // On affiche la valeur de nombre avec *pointeur

       

    return 0;

}

        

void triplePointeur(int *pointeurSurNombre)

{

    *pointeurSurNombre *= 3; // On multiplie par 3 la valeur de nombre

}



Comparez bien ce code source avec le précédent. Il y a de subtiles différences et pourtant le résultat est strictement le même :


15




Ce qui compte, c'est d'envoyer l'adresse de la variable nombre à la fonction. Or, pointeur vaut l'adresse de la variable nombre, donc c'est bon de ce côté ! On le fait seulement d'une manière différente en créant un pointeur dans la fonction main.


Dans le printf (et c'est juste pour l'exercice), j'affiche le contenu de la variable nombre en tapant *pointeur. Notez qu'à la place, j'aurais pu écrire nombre : le résultat aurait été identique car *pointeur et nombre désignent la même chose dans la mémoire.

Dans le programme « Plus ou Moins », nous avons utilisé des pointeurs sans vraiment le savoir. C'était en fait en appelant la fonction scanf. En effet, cette fonction a pour rôle de lire ce que l'utilisateur a entré au clavier et de renvoyer le résultat. Pour que la fonction puisse modifier directement le contenu de votre variable afin d'y placer la valeur tapée au clavier, elle a besoin de l'adresse de la variable :

int nombre = 0;

scanf("%d", &nombre);



La fonction travaille avec un pointeur sur la variable nombre et peut ainsi modifier directement le contenu de nombre.
Comme on vient de le voir, on pourrait créer un pointeur qu'on enverrait à la fonction scanf :

int nombre = 0;

int *pointeur = &nombre;

scanf("%d", pointeur);



Attention à ne pas mettre le symbole & devant pointeur dans la fonction scanf ! Ici, pointeur contient lui-même l'adresse de la variable nombre, pas besoin de mettre un & ! Si vous faisiez ça, vous enverriez l'adresse où se trouve le pointeur : or c'est de l'adresse de nombre dont on a besoin.

Créé avec HelpNDoc Personal Edition: Générateur de documentation complet