4.2. Notion de pointeur

Une adresse est une valeur. Cette valeur est souvent constante, car en général un objet ne se déplace pas en mémoire.

Un pointeur est une variable qui contient l'adresse d'un objet, par exemple l'adresse d'une autre variable. On dit que le pointeur pointe sur la variable pointée. Ici, pointer signifie « faire référence à ». La valeur d'un pointeur peut changer : cela ne signifie pas que la variable pointée est déplacée en mémoire, mais plutôt que le pointeur pointe sur autre chose.

Afin de savoir ce qui est pointé par un pointeur, les pointeurs disposent d'un type. Ce type est construit à partir du type de l'objet pointé. Cela permet au compilateur de vérifier que les manipulations réalisées en mémoire par l'intermédiaire du pointeur sont valides. Le type des pointeur se lit « pointeur de ... », où les points de suspension représentent le nom du type de l'objet pointé.

Les pointeurs se déclarent en donnant le type de l'objet qu'ils devront pointer, suivi de leur identificateur précédé d'une étoile :

int *pi;   // pi est un pointeur d'entier.

Note : Si plusieurs pointeurs doivent être déclarés, l'étoile doit être répétée :

int *pi1, *pi2, j, *pi3;
Ici, pi1, pi2 et pi3 sont des pointeurs d'entiers et j est un entier.

Il est possible de faire un pointeur sur une structure dans une structure en indiquant le nom de la structure comme type du pointeur :

typedef struct nom
{
    struct nom *pointeur;   /* Pointeur sur une structure "nom". */
    ...
} MaStructure;

Ce type de construction permet de créer des listes de structures, dans lesquelles chaque structure contient l'adresse de la structure suivante dans la liste. Nous verrons plus loin un exemple d'utilisation de ce genre de structure.

Il est également possible de créer des pointeurs sur des fonctions, et d'utiliser ces pointeurs pour paramétrer un algorithme, dont le comportement dépendra des fonctions ainsi pointées. Nous détaillerons plus loin ce type d'utilisation des pointeurs.