opérateurs d'additifs binaires +
et -
peuvent être utilisées quand un argument est un pointeur sur tout type complète (par exemple, T* p
) et l'autre argument est un nombre entier (par exemple, i
). Ils implémentent ce que l'on appelle l'arithmétique du pointeur .
Le compilateur suppose que le pointeur pointe vers un élément d'un tableau (par exemple, T array[N]
). L'opération produit un pointeur vers un autre élément du tableau, qui est i
éléments éloignés de l'élément d'origine. Il est possible de "déplacer" le pointeur dans l'une ou l'autre direction, c'est-à-dire vers le début du tableau ou vers la fin du tableau. Par exemple, si p
indique array[3]
, alors p + 4
pointera sur array[7]
.
L'opération est valable uniquement lorsque les points de résultat à un élément existant du tableau ou un après le dernier élément du tableau, à savoir étant donné le tableau T array[N]
, il est possible de créer des pointeurs vers des éléments de array[0]
à l'élément imaginaire array[N]
. Toute tentative de croiser ces limites à l'aide de l'arithmétique du pointeur entraîne un comportement indéfini.
Le type T
doit être complet, ce qui signifie que l'arithmétique de pointeur ne peut pas être utilisé avec des pointeurs void *
, pour un exemple, même si certains compilateurs permettent cela comme une extension (traitement void *
pointeurs comme équivalent à char *
pointeurs).
En plus des opérateurs d'additifs binaires, le calcul de pointeur comprend également préfixe et suffixe unaires ++
et --
opérateurs (appliqué à des pointeurs), ainsi que des opérateurs d'affectation de composé +=
et -=
(avec des pointeurs sur leur côté gauche et entiers sur le côté droit).
Dans votre cas, l'expression str + strlen(str)
produira un pointeur de type char *
qui pointe vers la terminaison \0
caractère de la chaîne str
.
'strlen()' renvoie en réalité un 'size_t', pas un' int'. L'une des différences importantes est que size_t est un type non signé, c'est-à-dire qu'il ne peut contenir que des nombres positifs. Cela a du sens - les longueurs de chaîne peuvent être de 0, 1 ou 30000 caractères, mais jamais -7. – MSalters