Programmation C-C++/Notion de pointeur
Notion de pointeur
modifierUne adresse est une valeur. On peut donc stocker cette valeur dans une variable. Les pointeurs sont justement des variables qui contiennent l'adresse d'autres objets, 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 à ». Les adresses sont généralement des valeurs constantes, car en général un objet ne se déplace pas en mémoire. Toutefois, 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.
Exemple pour une architecture 32 bits où sizeof(int) == 4 && sizeof(int*) == 4
:
Adresse | Mémoire (par mots de 32-bits) | Variable |
---|---|---|
0 | 0 | |
4 | 0 | |
... | ... | |
40804 | 45 | i |
40808 | 361 | j |
... | ... | |
41004 | 40808 | pi1 |
... | ... |
- Le pointeur pi1 contient l'adresse de j :
pi1 = &j; // 40808
. - La valeur pointée est celle de j :
*pi1 == j // Toujours vrai tant que pi1 == &j
.
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.