operatori additivi binari +
e -
possono essere utilizzati quando un argomento è un puntatore a qualsiasi tipo completa (ad esempio, T* p
) e l'altro argomento è un intero (ad esempio, i
). Implementano il cosiddetto aritmetico del puntatore .
Il compilatore presuppone che il puntatore punta a un elemento di un array (ad esempio, T array[N]
). L'operazione produce un puntatore a un altro elemento dell'array, che è i
elementi lontano dall'elemento originale. È possibile "spostare" il puntatore in entrambe le direzioni, cioè verso l'inizio dell'array o verso la fine dell'array. Ad esempio, se p
punta a array[3]
, quindi p + 4
punta a array[7]
.
L'operazione è valida solo quando i punti di risultato a un elemento esistente della matrice o uno dopo l'ultimo elemento della matrice, ossia data la matrice T array[N]
, è possibile creare puntatori a elementi dal array[0]
all'elemento immaginario array[N]
. Qualsiasi tentativo di superare questi limiti utilizzando il risultato aritmetico del puntatore nel comportamento non definito.
Il tipo T
deve essere completa, nel senso che l'aritmetica dei puntatori non può essere utilizzata con void *
puntatori, per un esempio, anche se alcuni compilatori permettono questo come un prolungamento (trattamento void *
puntatori come equivalente a char *
puntatori).
Oltre agli operatori additivi binari, puntatori include anche prefisso e suffisso unari ++
e --
operatori (applicato puntatori) così come operatori di assegnamento composto +=
e -=
(con puntatori nella sua sinistra e interi su il lato destro).
Nel tuo caso, str + strlen(str)
espressione produrrà un puntatore di char *
tipo che punta alla terminazione \0
carattere della stringa str
.
'strlen()' restituisce effettivamente un 'size_t', non un' int'. Una delle differenze importanti è che 'size_t' è un tipo senza segno, cioè può contenere solo numeri positivi. Questo ha senso - le lunghezze delle stringhe possono essere 0, 1 o 30000 caratteri, ma mai -7. – MSalters