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