Programmation en C – Les pointeurs
Les pointeurs en C sont faciles et amusants à apprendre. Certaines tâches de programmation C sont exécutées plus facilement avec des pointeurs, et d’autres tâches, telles que l’allocation de mémoire dynamique, ne peuvent pas être effectuées sans utiliser de pointeurs. Il devient donc nécessaire d’apprendre des pointeurs pour devenir un programmeur C parfait. Commençons à les apprendre en quelques étapes simples et faciles.
Comme vous le savez, chaque variable est un emplacement de mémoire et chaque adresse de mémoire a son adresse définie qui peut être accédée en utilisant l’opérateur (&), qui dénote une adresse dans la mémoire. Considérons l’exemple suivant, qui affiche l’adresse des variables définies.
#include <stdio.h> int main () { int var; char tab[10]; printf("Adresse de var : %xn", &var); printf("Adresse de tab : %xn", &tab); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Adresse de var : afe7a8e6 Adresse de tab : afe7a349
C’est quoi un pointeur?
Un pointeur est une variable dont la valeur est l’adresse d’une autre variable, c’est-à-dire l’adresse directe de l’emplacement de la mémoire. Comme toute variable ou constante, vous devez déclarer un pointeur avant de l’utiliser pour stocker toute adresse de variable. La forme générale d’une déclaration d’un pointeur est :
type *p;
Ici, type est le type de base du pointeur; il doit s’agir d’un type de données C valide et p est le nom de pointeur. L’astérisque * utilisé pour déclarer un pointeur est le même astérisque utilisé pour la multiplication. Cependant, dans cette déclaration, l’astérisque est utilisé pour désigner une variable comme un pointeur. Jetez un coup d’oeil à certaines des déclarations de pointeur valides
int *p1; /* pointeur vers un entier */ double *p2; /* pointeur vers un double */ float *p3; /* pointeur vers un flotteur */ char *p4; /* pointeur vers un caractère */
Le type de données de tous les pointeurs, qu’ils soient entier, flottant, caractère ou autre, est le même. La seule différence entre ces pointeurs c’est le types de données de la variable vers laquelle pointe le pointeur.
Comment utiliser un pointeur?
Il y a quelques opérations importantes, que nous ferons très souvent avec des pointeurs.
- Nous définissons une variable pointeur,
- assignons l’adresse d’une variable à un pointeur,
- accédons enfin à l’adresse disponible dans le pointeur.
Ceci est fait en utilisant l’opérateur unaire * qui renvoie la valeur de la variable située à l’adresse spécifiée par son opérande. L’exemple suivant utilise ces opérations :
#include <stdio.h> int main () { int var = 13; /* Déclaration de la variable var */ int *p; /* déclaration du pointeur p */ ip = &var; /* stocker l'adresse de var dans la variable de pointeur*/ printf("Adresse de la variable var: %xn", &var ); /* adresse stockée dans la variable pointeur */ printf("Adresse stockée dans la variable p: %xn", p ); /* accède à la valeur en utilisant le pointeur */ printf("Valeur de *p: %dn", *p ); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Adresse de la variable var: befa8b4c Adresse stockée dans la variable p: befa8b4c Valeur de *p: 13
Pointeur NULL
Il est toujours recommandé d’affecter une valeur NULL à un pointeur si vous n’avez pas d’adresse exacte à affecter. Ceci est fait au moment de la déclaration du pointeur . Un pointeur affecté à NULL s’appelle un pointeur NULL.
Le pointeur NULL est une constante dont la valeur est zéro est définie dans plusieurs bibliothèques standard. Considérez le programme suivant :
#include <stdio.h> int main () { int *p = NULL; printf("La valeur de p est : %xn", p ); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
La valeur de p est 0
Dans la plupart des systèmes d’exploitation, les programmes ne sont pas autorisés à accéder à la mémoire à l’adresse 0 car cette mémoire est réservée par le système d’exploitation. Cependant, l’adresse mémoire qui commence par 0 a une signification spéciale; il signale que le pointeur n’est pas destiné à pointer vers un emplacement de mémoire accessible. Mais par convention, si un pointeur contient la valeur null (zéro), il est supposé pointer vers rien.
Pour vérifier un pointeur nul, vous pouvez utiliser l’instruction ‘if’ comme suit :
if(p) /* true si p n’est pas nul */ if(!p) /* true si p est nul */
Les pointeurs en détail :