Mais que faire de ce pointeur ? Le pointeur sert à mémoriser l’adresse, (l’emplacement mémoire) d’une autre variable.
Les utilisations sont multiples et la suite du chapitre vous proposera deux applications des pointeurs : listes chaînées
et arbres binaires. En attendant, depuis un pointeur vous pouvez aussi accéder au contenu de la variable pointée. Il
suffit tant à l’affichage qu’à l’affectation de rajouter une étoile "*" avant son nom. Que provoque en C la ligne
suivante ?
printf("Contenu de la variable pointée via *p_i: %d\n",*p_i);
L’affichage du contenu présent à l’adresse pointée, donc le contenu de la variable pointée :
Contenu de la variable pointée via *p_i: 123456
Le fait d’accéder au contenu de la variable pointée s’appelle déréférencer un pointeur.
Avec ce système, il est possible de manipuler les variables et les pointeurs dans tous les sens. Si vous modifiez le
contenu de la variable pointée, l’adresse du pointeur n’est pas modifiée, mais son déréférencement affichera la
nouvelle valeur. Réciproquement, vous pouvez modifier la valeur de la variable pointée en passant par son pointeur
avec l’étoile devant.
/* modification de la valeur de la variable pointée par p_i */
*p_i=987654;
printf("i contient maintenant %d\n",i);
Le résultat est que vous venez de modifier le contenu de la zone mémoire à l’adresse pointée par p_i, qui est celle de
i. Vous venez donc de modifier la valeur de i en passant par un pointeur.
i contient maintenant 987654
c. Applications
Les applications sont nombreuses :
q En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structuré. Elle doit
retourner l’adresse de celleci, et donc son résultat sera placé dans un pointeur adéquat.
q Dans le chapitre sur les sousprogrammes, vous avez vu qu’il est possible de passer une variable en Sortie
(S) ou Entrée/Sortie (ES) à une procédure. D’après vous, quel est le mécanisme utilisé ? Le pointeur, bien
entendu : vous passez l’adresse de la variable en paramètre, et le sousprogramme va modifier le contenu de
la mémoire à cette adresse via un pointeur.
q Les pointeurs ouvrent la voie à l’utilisation de mécanismes complexes. Notamment, vous pouvez créer une
liste d’enregistrements ordonnés : un enregistrement contient une valeur, puis un pointeur vers
l’enregistrement suivant, et ainsi de suite…
q Dans un langage bas niveau comme le C, les tableaux se manipulent très facilement via des pointeurs,
puisqu’il est possible de faire des calculs sur les adresses : +1 va au contenu de l’adresse suivante, et ainsi
de suite.
Voici un simple exemple en C d’une fonction qui doit modifier le contenu d’une variable en passant tout d’abord par
une valeur de retour, puis par un pointeur.
La première fonction est très classique et ressemble beaucoup à ce qui existe en Java.
long modif(long var,long n)
{
var=n;
return var;
}
Elle s’utilise ainsi et n’amène pas de remarque particulière :
i=modif(i,1000);
printf("i contient maintenant %d\n",i);
La seconde fonction est modifiée pour prendre une adresse en paramètre :
- 4 -
© ENI Editions - All rigths reserved - Jonifar lina
166
Les utilisations sont multiples et la suite du chapitre vous proposera deux applications des pointeurs : listes chaînées
et arbres binaires. En attendant, depuis un pointeur vous pouvez aussi accéder au contenu de la variable pointée. Il
suffit tant à l’affichage qu’à l’affectation de rajouter une étoile "*" avant son nom. Que provoque en C la ligne
suivante ?
printf("Contenu de la variable pointée via *p_i: %d\n",*p_i);
L’affichage du contenu présent à l’adresse pointée, donc le contenu de la variable pointée :
Contenu de la variable pointée via *p_i: 123456
Le fait d’accéder au contenu de la variable pointée s’appelle déréférencer un pointeur.
Avec ce système, il est possible de manipuler les variables et les pointeurs dans tous les sens. Si vous modifiez le
contenu de la variable pointée, l’adresse du pointeur n’est pas modifiée, mais son déréférencement affichera la
nouvelle valeur. Réciproquement, vous pouvez modifier la valeur de la variable pointée en passant par son pointeur
avec l’étoile devant.
/* modification de la valeur de la variable pointée par p_i */
*p_i=987654;
printf("i contient maintenant %d\n",i);
Le résultat est que vous venez de modifier le contenu de la zone mémoire à l’adresse pointée par p_i, qui est celle de
i. Vous venez donc de modifier la valeur de i en passant par un pointeur.
i contient maintenant 987654
c. Applications
Les applications sont nombreuses :
q En C une fonction ne sait pas retourner directement un tableau ou un enregistrement structuré. Elle doit
retourner l’adresse de celleci, et donc son résultat sera placé dans un pointeur adéquat.
q Dans le chapitre sur les sousprogrammes, vous avez vu qu’il est possible de passer une variable en Sortie
(S) ou Entrée/Sortie (ES) à une procédure. D’après vous, quel est le mécanisme utilisé ? Le pointeur, bien
entendu : vous passez l’adresse de la variable en paramètre, et le sousprogramme va modifier le contenu de
la mémoire à cette adresse via un pointeur.
q Les pointeurs ouvrent la voie à l’utilisation de mécanismes complexes. Notamment, vous pouvez créer une
liste d’enregistrements ordonnés : un enregistrement contient une valeur, puis un pointeur vers
l’enregistrement suivant, et ainsi de suite…
q Dans un langage bas niveau comme le C, les tableaux se manipulent très facilement via des pointeurs,
puisqu’il est possible de faire des calculs sur les adresses : +1 va au contenu de l’adresse suivante, et ainsi
de suite.
Voici un simple exemple en C d’une fonction qui doit modifier le contenu d’une variable en passant tout d’abord par
une valeur de retour, puis par un pointeur.
La première fonction est très classique et ressemble beaucoup à ce qui existe en Java.
long modif(long var,long n)
{
var=n;
return var;
}
Elle s’utilise ainsi et n’amène pas de remarque particulière :
i=modif(i,1000);
printf("i contient maintenant %d\n",i);
La seconde fonction est modifiée pour prendre une adresse en paramètre :
- 4 -
© ENI Editions - All rigths reserved - Jonifar lina
166
