Les Pointeurs
Les Pointeurs
Les Pointeurs
Votre mémoire n'est faite que pour stocker des nombres. Elle ne peut stocker
ni lettres ni phrases. Pour contourner ce problème, on a inventé une table qui
fait la liaison entre les nombres et les lettres. Cette table dit par exemple : « Le
nombre 89 représente la lettre Y ».
Adresse et valeur
Quand vous créez une variable age de type int par exemple, en tapant ça :
int age = 10; votre programme demande au système d'exploitation (Windows,
par exemple) la permission d'utiliser un peu de mémoire. Le système
d'exploitation répond en indiquant à quelle adresse en mémoire il vous laisse
le droit d'inscrire votre nombre. C'est d'ailleurs justement là un des rôles
principaux d'un système d'exploitation : on dit qu'il alloue de la mémoire aux
programmes. C'est un peu lui le chef, il contrôle chaque programme et vérifie
que ce dernier a l'autorisation de se servir de la mémoire à l'endroit où il le fait.
Partie 2 : Techniques « avancées » du langage C : 2.Les pointeurs
2.Les pointeurs
Créer un pointeur :
il est important d'initialiser dès le début ses variables, en leur donnant la valeur 0 par exemple.
C'est encore plus important de le faire avec les pointeurs ! Pour initialiser un pointeur, c'est-à-
dire lui donner une valeur par défaut, on n'utilise généralement pas le nombre 0 mais le mot-
clé NULL(veillez à l'écrire en majuscules) :
int *monPointeur = NULL; Là, vous avez un pointeur initialisé à NULL. Comme ça, vous saurez
dans la suite de votre programme que votre pointeur ne contient aucune adresse. Que se
passe-t-il ? Ce code va réserver une case en mémoire comme si vous aviez créé une variable
normale. Cependant, et c'est ce qui change, la valeur du pointeur est faite pour contenir une
adresse. L'adresse… d'une autre variable. Pourquoi pas l'adresse de la variable age? Vous
savez maintenant comment indiquer l'adresse d'une variable au lieu de sa valeur (en utilisant
le symbole &),Ça nous donne : int age = 10; int *pointeurSurAge = &age;
Partie 2 : Techniques « avancées » du langage C : 2.Les pointeurs
Créer un pointeur :
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. pour ne pas tout mélanger, sachez qu'on peut la
découper en deux temps :
int age = 10;
int *pointeurSurAge; // 1) signifie "Je crée un pointeur"
pointeurSurAge = &age; // 2) signifie "pointeurSurAge contient l'adresse de
la variable 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. pour ne pas tout mélanger, sachez qu'on peut la
découper en deux temps :
Vous remarquerez qu'il n'y a pas de type « pointeur » comme il y a un type int et un type double. On
n'écrit donc pas : pointeur pointeurSurAge; Vocabulaire : on dit que le pointeur pointeurSurAge pointe
sur la variable age.
Partie 2 : Techniques « avancées » du langage C : 2.Les pointeurs
Créer un pointeur :
Il n’y a pas de type « pointeur » comme il y a un type int et un type double. On n'écrit donc pas :
pointeur pointeurSurAge;
Au lieu de ça, on utilise le symbole *, mais on continue à écrire int. Qu'est-ce que ça signifie ?
En fait, on doit indiquer quel est le type de la variable dont le pointeur va contenir l'adresse.
Comme notre pointeur pointeurSurAge va contenir l'adresse de la variable age (qui est de
type int), alors mon pointeur doit être de type int* ! Si ma variable age avait été de type
double, alors j'aurais dû écrire double *monPointeur.
Vocabulaire : on dit que le pointeur pointeurSurAge pointe sur la variable age.
La fig. suivante résume ce qu'il s'est passé dans la mémoire.
Partie 2 : Techniques « avancées » du langage C : 2.Les pointeurs
Créer un pointeur :
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, on 'aurait pu faire un simple return comme on a appris à le faire. 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 !
Partie 2 : Techniques « avancées » du langage C : 2.Les pointeurs
Une autre façon d’envoyer un pointeur à une Ce qui compte, c'est d'envoyer l'adresse de la variable
fonction. Comparez bien ce code source avec nombre à la fonction. Or, pointeur vaut
le précédent. Il y a de subtiles différences et l'adresse de la variable nombre! On le fait seulement
pourtant le résultat est strictement le même : 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, on affiche le contenu de la variable
nombre en tapant *pointeur. Notez qu'à la place,
on aurait pu écrire nombre : le résultat aurait été
identique car *pointeur et nombre désignent la
même chose dans la mémoire. 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 :
Partie 2 : Techniques « avancées » du
langage C : 2.Les pointeurs
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 :
Code : C
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.
Partie 2 : Techniques « avancées » du
langage C : 2.Les pointeurs