operadores aditivos binarios +
y -
se pueden utilizar cuando un argumento es un puntero a cualquier tipo completo (por ejemplo, T* p
) y el otro argumento es un número entero (por ejemplo, i
). Implementan lo que se llama puntero aritmética.
El compilador supone que el puntero apunta a un elemento de una matriz (por ejemplo, T array[N]
). La operación produce un puntero a otro elemento de la matriz, que está i
elementos lejos del elemento original. Es posible "mover" el puntero en cualquier dirección, es decir, hacia el comienzo de la matriz o hacia el final de la matriz. Por ejemplo, si p
apunta a array[3]
, entonces p + 4
apuntará a array[7]
.
La operación sólo es válida cuando los puntos de resultados a un elemento existente de la matriz o uno más allá del último elemento de la matriz, es decir, dados la matriz T array[N]
, es posible crear punteros a elementos de array[0]
al elemento imaginario array[N]
. Cualquier intento de cruzar estos límites usando la aritmética del puntero produce un comportamiento indefinido.
El tipo T
tiene que ser completa, lo que significa que la aritmética de punteros no se puede utilizar con void *
punteros, por ejemplo, a pesar de que algunos compiladores permiten esto como una extensión (tratamiento de void *
punteros como equivalentes a char *
punteros).
Además de los operadores aditivos binarios, la aritmética de punteros también incluye prefijo y posfijo unarios ++
y --
operadores (aplicado a los punteros), así como los operadores de asignación compuesto +=
y -=
(con indicaciones sobre su lado izquierdo y enteros en el lado derecho).
En su caso, str + strlen(str)
expresión producirá un puntero de tipo char *
que apunta a la \0
carácter de terminación de la cadena str
.
'strlen()' en realidad devuelve un 'size_t', no un' int'. Una de las diferencias importantes es que 'size_t' es un tipo sin signo, es decir, solo puede contener números positivos. Esto tiene sentido: las longitudes de cadena pueden ser 0, 1 o 30000 caracteres, pero nunca -7. – MSalters