Leçon 36 : Pointeurs Partie 3 : Arithmétique des pointeurs
L'arithmétique des pointeurs nous permet de déplacer un pointeur vers l'avant ou vers l'arrière dans des blocs de mémoire contigus, typiquement des tableaux.
La règle de l'arithmétique des pointeurs
Lorsque vous ajoutez un entier $N$ à un pointeur, l'adresse n'augmente pas de $N$ octets, mais de $N$ fois la taille (sizeof()) du type de données pointé par le pointeur.
Nouvelle adresse = Adresse actuelle + (N * sizeof(type_de_donnees))
Exemple
Supposons qu'un int occupe 4 octets. p commence à l'adresse 1000.
c int arr[3] = {10, 20, 30}; int *p = arr; // p est à l'adresse 1000
p++; // p passe à l'élément entier suivant (adresse 1004)
printf("%d\n", *p); // Résultat : 20
p = p + 2; // p avance de deux entiers (adresse 1004 + 8 = 1012) printf("%d\n", *p); // Résultat : 30
Opérations autorisées sur les pointeurs
- Addition/Soustraction d'un entier : Déplace l'emplacement du pointeur.
- Incrémentation/Décrémentation (
++,--) : Déplace le pointeur vers l'élément suivant/précédent. - Soustraction de deux pointeurs : Calcule le nombre d'éléments entre deux pointeurs (le résultat est un entier, souvent de type
ptrdiff_t). - Comparaison : Les pointeurs peuvent être comparés (
==,!=,>, etc.). Cela n'a de sens que s'ils pointent vers des éléments du même tableau.
Pointeurs génériques (void *)
Un pointeur void * peut contenir l'adresse de n'importe quel type de données. Il est utile pour les opérations mémoire générales. Cependant, vous ne pouvez pas déréférencer ou effectuer d'arithmétique directement sur un void * car le compilateur ne connaît pas la taille des données pointées.