Next: Discussion
Up: Les pointeurs
Previous: Exercice
Sous-sections
En ce qui concerne le passage de paramètres à une procédure, le programmeur
a deux besoins fondamentaux :
- -
- soit il désire passer une valeur qui sera
exploitée par l'algorithme de la procédure (c'est ce dont on a besoin quand
on écrit par exemple sin(x)).
Une telle façon de passer un paramètre s'appelle du passage par valeur ;
- -
- soit il désire passer une référence à une variable, de
manière à permettre à la procédure de modifier la valeur de cette
variable.
C'est ce dont on a besoin quand on écrit une procédure réalisant le produit
de deux matrices prodmat(a,b,c) où l'on veut qu'en fin d'exécution
de prodmat, la matrice c soit égale au produit matriciel des
matrices a et b.
prodmat a besoin des valeurs des matrices a et
b, et d'une référence vers la matrice c.
Une telle façon de passer un paramètre s'appelle du passage par adresse.
Face à ces besoins, les concepteurs de langages de programmation ont
imaginé différentes manières de les satisfaire, et quasiment chaque
langage de programmation dispose de sa stratégie propre de passage de
paramètres.
- -
- Une première possibilité consiste à arguer du fait que le passage de
paramètre par adresse est plus puissant que le passage par valeur, et à
réaliser tout passage de paramètre par
adresse (c'est la stratégie de FORTRAN et PL/1) ;
- -
- Une seconde possibilité consiste à permettre au programmeur de déclarer
explicitement quels paramètres il désire passer par valeur et quels
paramètres il désire passer par adresse (c'est la stratégie de PASCAL) ;
- -
- La dernière possibilité consistant à réaliser tout passage de
paramètre par valeur semble irréaliste puisqu'elle ne permet pas de
satisfaire le besoin de modification d'un paramètre.
C'est cependant la stratégie choisie par les concepteurs du langage C.
En C, tout paramètre est passé par valeur, et cette règle ne souffre
aucune exception.
Cela pose le problème de réaliser un passage de paramètre par adresse lorsque
le programmeur en a besoin. La solution à ce problème consiste dans ce cas,
à déclarer le paramètre comme étant un pointeur. Cette solution n'est
rendue possible que par l'existence de l'opérateur adresse de qui permet
de délivrer l'adresse d'une lvalue.
Voyons sur un exemple. Supposons que nous désirions écrire une procédure
add, admettant trois paramètres a, b et c.
Nous désirons que le résultat de
l'exécution de add soit d'affecter au paramètre c la somme
des valeurs des deux premiers paramètres.
Le paramètre c ne peut évidemment pas être passé par valeur,
puisqu'on désire modifier la valeur du paramètre effectif correspondant.
Il faut donc programmer add de la manière suivante :
void add(int a, int b, int *c)
/* c repère l'entier où on veut mettre le résultat */
{
*c = a + b;
}
int main()
{
int i,j,k;
/* on passe les valeurs de i et j comme premiers paramètres */
/* on passe l'adresse de k comme troisième paramètre */
add(i,j,&k);
}
Next: Discussion
Up: Les pointeurs
Previous: Exercice
Bernard Cassagne
1998-12-09