Le pointeur en langage C est un outil très puissant pour réaliser certaines tâches. C’est un concept à bien saisir pour améliorer ses compétences en C. Certains algorithmes seront plus compliqués voire impossibles à écrire sans l’utilisation des pointeurs.
Introduction
Dans un programme, tout élément défini (les variables, objets, fonctions, etc) est stocké dans une mémoire à une adresse spécifique. Pour retrouver cet élément, il suffit de connaitre l’adresse mémoire utilisée par l’élément ou la première adresse utilisé dans le cas où la variable prend plusieurs zones mémoire.
Le pointeur est une variable contenant l’adresse mémoire d’une autre variable (ou objet). Même si la valeur d’un pointeur est toujours un entier le type dépend de l’objet vers lequel il pointe.
Déclarer un pointeur
Le type du pointeur doit être identique au type de la variable qu’il adresse.
<type> * <pointer_name> //ou <type> *<pointer_name>
Ex:
float myfloat float * myfloataddress; int myint int * myintaddress;
On peut donc initialiser la variable et son adresse sur la même ligne
int i,*pi;
Opération sur les pointeurs
L’adresse d’une variable est un entier. Il est donc possible d’ajouter et de soustraire un entier à une adresse afin d’obtenir un pointeur de même type à une adresse différente.
ptr+i –> adresse contenue dans ptr + i * taille du type de ptr
On peut aussi soustraire deux adresses qui pointent vers un même type. La soustraction est utile, par exemple, lorsque les deux pointeurs pointent vers le même tableau pour connaitre le nombre d’éléments entre les deux éléments pointés.
ptr1-ptr2 –> (adresse pointé par ptr1 – adresse pointé par ptr2)/( taille du type de ptr1 et ptr2)
Il est aussi possible de comparer la valeur des adresses avec les opérateurs <,>,<=,>=,!= et ==
Modifier la valeur d’une variable en utilisant un pointeur
Dans l’exemple suivant, x est une variable de type entier, p est un pointeur de type entier contenant l’adresse de la variable x. La valeur de x initialisée à 3 passe à 21 en utilisant le pointeur.
int x=3; int * p=&x; *p=21; // is equivalent to x=21; printf("valeur de *p = %d\n",*p); // equivalent to printf("valeur de x = %d\n",x);
Modifier une variable en entrée d’une fonction
En C, une fonction ne peut retourner qu’une seule variable. Pour renvoyer, plusieurs valeurs il est possible d’utiliser les pointeurs de ces variables en entrée plutôt que de renvoyer ces valeurs .
#include <iostream> int myparam=5; struct mystruct_T{ int val1; int val2; }STRUCT; void change_struct( mystruct_T * mystruct, int * param) { mystruct->val1=10; *param=26; } int main(){ change_struct(&STRUCT, &myparam); printf("Struct.val1 : %d",STRUCT.val1); printf("param : %d",myparam); }
Grâce à cette méthode, il est possible de modifier plusieurs variables comme si la fonctionne renvoyait plusieurs valeurs.
Petit résumé
- Un pointeur est une variable qui contient l’adresse d’une autre variable
- Pour avoir accès à l’adresse de la variable var on utilise l’opérateur d’adresse(&): &var
- Pour avoir la valeur de la variable à partir de l’adresse on utilise l’opérateur unaire d’indirection(*) : *pointer
- Lorsqu’on utilise un pointeur de structure on utilise l’opérateur -> pour accéder au membre de la structure: mystruct->elm1
- Il est possible de pointer vers des fonctions