Pointeurs et opérateurs additifs next up previous contents index
Suivant: Différence de deux pointeurs Début: Les pointeurs Précédent: Exercice


Paragraphes

Pointeurs et opérateurs additifs

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 licence concernant l'élément juste après le dernier élément a été introduite pour les problèmes de fin de boucle de parcours de tableau (mais on aurait pu s'en passer).

Opérateurs ++ et -

  On peut appliquer les opérateurs ++ et - à des pointeurs et il est classique de les utiliser pour réaliser des parcours de tableaux. Exemple (on rappelle que toute chaîne est terminée par un null, c'est à dire le caractère '\0') :  
char mess[] = "Hello world!!";
char *p;

for (p = &mess[0]; *p != '\0'; p++)
   {
   /*   ici p repère l'élément courant de mess   */
   }

Autre classique, en reprenant les variables mess et p de l'exemple précédent :

p = &mess[0];
while (*p != '\0')
   {
   /*   ici utilisation de *p++   */
   }




30/9/1997