2013-05-11 3 views
5

Perché il programma,Incremento puntatori char in C++

char *s, *p, c; 

s = "abc"; 

printf(" Element 1 pointed to by S is '%c'\n", *s); 
printf(" Element 2 pointed to by S is '%c'\n", *s+1); 
printf(" Element 3 pointed to by S is '%c'\n", *s+2); 
printf(" Element 4 pointed to by S is '%c'\n", *s+3); 
printf(" Element 5 pointed to by S is '%c'\n", s[3]); 
printf(" Element 4 pointed to by S is '%c'\n", *s+4); 

dare i seguenti risultati?

Element 1 pointed to by S is 'a' 
Element 2 pointed to by S is 'b' 
Element 3 pointed to by S is 'c' 
Element 4 pointed to by S is 'd' 
Element 5 pointed to by S is ' ' 
Element 4 pointed to by S is 'e' 

Come ha fatto il compilatore a continuare la sequenza? E perché s[3] restituisce un valore vuoto?

+5

Precedenza. Vuoi '* (s + 1)' ecc. Ma '* (s + 4)' sarebbe un comportamento indefinito. –

+0

's [3]' restituisce il carattere 4 ° (sono indicizzati da 0), che è una stringa che termina il carattere '\ 0'. –

+0

's [3]' è '\ 0', quindi non mostra nessuno –

risposta

9

Non continua la sequenza. Stai facendo *s+3 quale primo riferimento s per darti il ​​char con il valore 'a', e quindi stai aggiungendo al valore char. L'aggiunta di 3 a 'a' fornisce il valore di 'd' (almeno nel set di caratteri di esecuzione).

Se li si modifica in *(s+1) e così via, si otterrà il comportamento non definito che è previsto.

s[3] accede all'ultimo elemento della stringa che è il carattere null.

+0

capito! Grazie! – zalyahya

+5

Un suggerimento - '" abc "' spesso non è una buona stringa di test - è troppo facile ottenere il risultato previsto (o qualcosa che si chiude in modo confuso) per errore dal codice errato. – Steve314

2

Si noti che *s è un carattere, che è essenzialmente un numero. Aggiungendo un altro numero ad esso, si ottiene un personaggio con un valore ASCII più alto. Il s[3] è vuoto, perché è stato assegnato solo "abc" alle voci 0,1,2 rispettivamente. In effetti il ​​terzo carattere è il carattere '\ 0'.