Soient p une valeur pointeur vers des objets de type T et un tableau dont les éléments sont du même type T ; si p repère l'élément d'indice i du tableau, p + j est une valeur de type pointeur vers T, qui repère l'élément d'indice i + j du tableau (en supposant qu'il existe).
Il en va de même avec l'opérateur soustraction : si p repère l'élément d'indice i d'un tableau, p - j repère l'élément d'indice i - j du tableau (toujours en supposant qu'il existe). Exemple :
#define N 10 int t[N]; int *p,*q,*r,*s; p = &t[0]; /* p repère le premier élément de t */ q = p + (N-1); /* q repère le dernier élément de t */ r = &t[N-1]; /* r repère le dernier élément de t */ s = r - (N-1); /* s repère le premier élément de t */
La norme précise que pour réaliser la somme ou la différence d'un pointeur et d'un entier, il faut qu'à la fois le pointeur et le résultat repèrent les éléments d'un même tableau ou l'élément (fictif) après le dernier élément du tableau. En d'autre termes, si on a :
#define N 100 int t[N]; int * p = &t[0];L'expression
p + N
est valide, mais p - 1
ou p + N + 1
ne sont pas valides.
La possibilité de référencer l'élément (fictif) après le dernier élément
d'un tableau a été introduite pour les problèmes de fin de boucle de
parcours de tableau (mais on aurait pu s'en passer).
Matthieu Moy 2017-02-08