Maîtriser les pointeurs en C : Étapes pratiques vers la programmation avancée
Les pointeurs en C sont simples et amusants à apprendre. Certaines tâches sont plus faciles avec des pointeurs, d'autres — comme l'allocation mémoire dynamique — sont impossibles sans eux. Indispensables pour devenir un bon programmeur C.
Chaque variable est une adresse mémoire, accessible via l'opérateur & (adresse de). Exemple :
#include <stdio.h>
int main() {
int var1;
char var2[10];
printf("Adresse de var1 : %p\n", (void*)&var1);
printf("Adresse de var2 : %p\n", (void*)&var2);
return 0;
}
Résultat typique (adresses hexadécimales) :
Adresse de var1 : 0x7ffd8b3c Adresse de var2 : 0x7ffd8b36
Qu'est-ce qu'un pointeur ?
Un pointeur est une variable dont la valeur est l'adresse d'une autre variable (adresse directe en mémoire). Comme toute variable, il doit être déclaré avant usage. Forme générale :
type *nom_var;
type : type de base du pointeur (type C valide). nom_var : nom du pointeur. L'astérisque * désigne ici un pointeur (pas multiplication).
Déclarations valides :
int *ip; // pointeur vers int double *dp; // pointeur vers double float *fp; // pointeur vers float char *ch; // pointeur vers char
Tous les pointeurs stockent une adresse (nombre hexadécimal long). La différence est le type de donnée pointée.
Comment utiliser les pointeurs ?
Opérations fréquentes : (a) déclarer un pointeur, (b) y assigner l'adresse d'une variable (&), (c) accéder à la valeur à cette adresse via l'opérateur unaire * (déréférencement).
#include <stdio.h>
int main() {
int var = 20;
int *ip;
ip = &var; // stocke l'adresse de var
printf("Adresse de var : %p\n", (void*)&var);
printf("Adresse dans ip : %p\n", (void*)ip);
printf("Valeur de *ip : %d\n", *ip); // déréférencement
return 0;
}
Résultat :
Adresse de var : 0x7ffd8b3c Adresse dans ip : 0x7ffd8b3c Valeur de *ip : 20
Pointeurs NULL
Bonne pratique : initialisez à NULL si pas d'adresse précise. NULL = 0 (défini dans bibliothèques standards). Un pointeur NULL ne pointe vers rien.
#include <stdio.h>
int main() {
int *ptr = NULL;
printf("Valeur de ptr : %p\n", (void*)ptr);
return 0;
}
Résultat : Valeur de ptr : (nil) (ou 0).
L'adresse 0 est réservée par l'OS. Par convention, pointeur NULL = ne pointe vers rien.
Test : if (ptr) (non-NULL) / if (!ptr) (NULL).
Pointeurs en détail
Concepts importants :
| N° | Concept et description |
|---|---|
| 1 | Arithmétique des pointeurs : ++, --, +, - sur pointeurs. |
| 2 | Tableaux de pointeurs : tableaux contenant des pointeurs. |
| 3 | Pointeur vers pointeur : C permet plusieurs niveaux d'indirection. |
| 4 | Passage de pointeurs aux fonctions : passage par adresse/référence permet de modifier l'argument dans l'appelant. |
| 5 | Retour de pointeur depuis fonction : retour vers variable locale static, variable globale, ou mémoire allouée dynamiquement. |
Langue C
- Variables, constantes et littéraux en C : Guide complet
- Comprendre les classes de stockage en C : Portée, durée de vie et performance
- Maîtriser les pointeurs en C : Tutoriel pratique guidé par des experts
- Comprendre la relation entre les tableaux et les pointeurs en C
- Programmation C : Passage d'adresses et de pointeurs aux fonctions – Guide pratique
- Maîtriser les structures et pointeurs en C : Guide pratique
- Maîtriser le mot-clé global en Python : Comment et quand l'utiliser
- Maîtriser les pointeurs en C++ : Concepts, exemples et applications pratiques
- Variables C, types de données et constantes – Guide pratique