Pour de nombreuses raisons, liées en partie à lhistorique 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 ladresse dune 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 la initialisé sur ladresse de la variable i. En effet, dans ce contexte, lopérateur &
désigne ladresse en mémoire dune variable (écriture cohérente avec son usage pour les références). Si lon imagine par exemple que le compilateur a placé la variable i à ladresse 1000 (cest-à-dire dans les octets numérotés 1000 et 1001), alors la valeur de p sera précisément cette adresse 1000. Il sagit donc effectivement dun 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 à ladresse 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 lon appelle déréférencement le fait dappliquer lopérateur *
à un pointeur.
On peut alors avoir accès à la valeur de i par lintermé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 nest 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 | Sommaire | Suivant |