Opérateurs + et -

L'opérateur + permet de réaliser la somme de deux valeurs arithmétiques, mais il permet également de réaliser la somme d'un pointeur et d'un entier. Une telle opération n'a de sens cependant, que si le pointeur repère un élément d'un tableau.

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