Documente Academic
Documente Profesional
Documente Cultură
« Impossible » !!
En effet, on ne peut renvoyer qu'une valeur par fonction :
int fonction()
{
return valeur;
}
void fonction()
{
Mais renvoyer deux valeurs à la fois… c'est impossible. On ne peut pas faire deux return.
Supposons que je veuille écrire une fonction à laquelle on envoie un nombre de minutes.
#include <stdio.h>
#include <stdlib.h>
return 0;
Résultat :
0 heures et 90 minutes
Résultat à l'écran :
La variable age vaut : 10
Résultat :
L'adresse de la variable age est : 0023FF74
Avec age, l'ordinateur va lire la valeur de la variable en mémoire et vous renvoie cette valeur.
Avec &age, votre ordinateur vous dit en revanche à quelle adresse se trouve la variable.
Créer un pointeur
Pour créer une variable de type pointeur, on doit rajouter le symbole * devant le nom de la
variable.
int *monPointeur;
Initialisation du pointeur :
int *monPointeur = NULL;
int age = 10;
int *pointeurSurAge = &age;
La première ligne signifie : « Créer une variable de type int dont la valeur vaut 10 ». La
seconde ligne signifie : « Créer une variable de type pointeur dont la valeur vaut l'adresse de
la variable age».
La seconde ligne fait donc deux choses à la fois.
printf("%d", pointeurSurAge);
177450
On demande la valeur de pointeurSurAge, et sa valeur c'est l'adresse de la variable age
(177450).
Comment faire pour demander à avoir la valeur de la variable se trouvant à l'adresse indiquée
dans pointeurSurAge? Il faut placer le symbole * devant le nom du pointeur :
printf("%d", *pointeurSurAge);
10
En plaçant le symbole*devant le nom du pointeur, on accède à la valeur de la variableage.
Si au contraire on avait utilisé le symbole & devant le nom du pointeur, on aurait obtenu
l'adresse à laquelle se trouve le pointeur (ici, c'est 3).
Qu'est-ce qu'on y gagne ? On a simplement réussi à compliquer les choses ici. On n'avait pas
besoin d'un pointeur pour afficher la valeur de la variable age!
À retenir absolument
Voici ce qu'il faut avoir compris et ce qu'il faut retenir pour la suite de ce chapitre :
sur une variable, comme la variableage:
o age signifie : « Je veux la valeur de la variableage»,
o &age signifie : « Je veux l'adresse à laquelle se trouve la variableage» ;
sur un pointeur, commepointeurSurAge:
o pointeurSurAge signifie : « Je veux la valeur depointeurSurAge» (cette
valeur étant une adresse),
o *pointeurSurAge signifie : « Je veux la valeur de la variable qui se trouve à
l'adresse contenue danspointeurSurAge».
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.
Exemple :
return 0;
}
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:
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:
return 0;
}
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.
decoupeMinutes(&heures, &minutes);
return 0;
des pointeurs ! Comme ça, vous pouvez modifier la valeur des variables,
}
Résultat :
1 heures et 30 minutes
Explication :
En résumé