Next: Différence de deux pointeurs
Up: Les pointeurs
Previous: Exercice
Sous-sections
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).
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++ */
}
Next: Différence de deux pointeurs
Up: Les pointeurs
Previous: Exercice
Bernard Cassagne
1998-12-09