L'arithmétique des pointeurs est une caractéristique fondamentale du langage C, rendant le travail avec la mémoire flexible, mais aussi potentiellement dangereux.
L'arithmétique des pointeurs a émergé en raison des particularités des langages à bas niveau et est orientée vers le travail avec des tableaux et le traitement de données structurées directement en mémoire. En C, tous les pointeurs "savent" la taille du type auquel ils pointent.
De nombreux développeurs se trompent en pensant qu'en ajoutant un à un pointeur, l'adresse augmentera exactement d'un octet. En réalité, l'augmentation se fait de sizeof(type). Lorsqu'on travaille avec différents types de données, en particulier avec des structures de tailles différentes, il est facile de se tromper lors des transitions en mémoire. De plus, l'arithmétique des pointeurs n'est pas permise avec void* — c'est une erreur standard.
Toutes les opérations arithmétiques avec les pointeurs prennent en compte la taille du type correspondant, rendant les opérations avec des tableaux aussi efficaces que possible. Par exemple :
#include <stdio.h> int arr[4] = {10, 20, 30, 40}; int *p = arr; printf("%d\n", *(p + 2)); // Affichera 30
Ici (p + 2) déplace le pointeur de 2 * sizeof(int) octets en avant, et non simplement de 2 octets.
Caractéristiques clés :
Peut-on effectuer des opérations d'incrémentation/décrémentation avec des pointeurs sur void ?
Non, la norme C interdit l'arithmétique avec void*. Il faut d'abord convertir le pointeur en un type concret, par exemple (char*), avant d'effectuer l'arithmétique.
void *vp = arr; char *cp = (char *)vp; cp++;
Que se passe-t-il si l'on ajoute à un pointeur sur une structure ou un tableau une valeur dépassant la taille du tableau ?
Cela entraînera un dépassement de la zone mémoire autorisée (comportement indéfini). C ne vérifie pas les limites des tableaux — la responsabilité revient au programmeur.
Peut-on additionner deux pointeurs directement ?
Non, l'addition de pointeurs est interdite et n'a pas de sens. On ne peut que soustraire deux pointeurs appartenant au même tableau.
Un jeune développeur, travaillant avec un tableau d'int par pointeurs, décalait le pointeur d'un nombre fixe d'octets, oubliant la taille du type.
Avantages :
Inconvénients :
Un développeur expérimenté utilise toujours des expressions comme (ptr + n), faisant confiance au compilateur pour ajuster le décalage en fonction de la taille du type.
Avantages :
Inconvénients :