Pointeurs

Pour de nombreuses raisons, liées en partie à l’historique du C, les pointeurs jouent un rôle central en C et en C++. Nous en détaillons ici les caractéristiques et de nombreux exemples seront vus dans toute la suite.

Un pointeur est un nombre qui désigne l’adresse d’une partie de la mémoire. Voici un exemple :

int i = 18;
int* p = &i;

On a ici déclaré un pointeur p sur le type int (type int*), et on l’a initialisé sur l’adresse de la variable i. En effet, dans ce contexte, l’opérateur & désigne l’adresse en mémoire d’une variable (écriture cohérente avec son usage pour les références). Si l’on imagine par exemple que le compilateur a placé la variable i à l’adresse 1000 (c’est-à-dire dans les octets numérotés 1000 et 1001), alors la valeur de p sera précisément cette adresse 1000. Il s’agit donc effectivement d’un nombre, de deux ou quatre octets, voire plus, selon les types de machines, mais que nous dénommerons plus fréquemment adresse par la suite.

La donnée pointée par p est, par définition, celle qui se trouve à l’adresse qui est la valeur de p. On la dénote *p (aucun rapport avec la multiplication, * est ici un opérateur unaire, tout comme & est unaire quand il désigne un adressage), et l’on appelle déréférencement le fait d’appliquer l’opérateur * à un pointeur.

On peut alors avoir accès à la valeur de i par l’intermédiaire de p, en écrivant par exemple :

*p = 20;

ce qui modifie le contenu de la case pointée par p, donc i. Notons bien que, dans cette opération, p n’est absolument pas modifié et reste un pointeur sur i.

On notera que, pour les mêmes raisons que pour les références, on déclare souvent les pointeurs ainsi :

int *p;

Ceci est cohérent, puisque *p désigne effectivement une variable de type int, et permet de placer plusieurs déclarations ensemble, comme ceci :

int i = 18, j = i, *p = &i, &k  = i;

Signalons un type pointeur très souvent utilisé, le type char*. Il permet de désigner une chaîne de caractères, en pointant sur le premier élément de cette chaîne. La librairie <string.h> qui opère sur ces chaînes prend toujours le type char* comme argument de ses fonctions. Nous donnerons des exemples de telles fonctions dans la suite.

Exercice 3.2

Que désignent les déclarations suivantes :

int *p[10];
int (*q)[5];
int *(r[7]);
Voir solution
Précédent Précédent Sommaire Sommaire Suivant Suivant