2013-05-11 20 views
5

Dlaczego program,Zwiększanie char wskaźniki w 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); 

dają następujące wyniki?

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' 

W jaki sposób kompilator kontynuował sekwencję? I dlaczego s[3] zwraca pustą wartość?

+5

Pierwszeństwo. Chcesz '* (s + 1)' itd. Ale '* (s + 4)' byłoby niezdefiniowanym zachowaniem. –

+0

's [3]' zwraca 4-ci znak (są one indeksowane od 0), który jest łańcuchem kończącym znak "\ 0". –

+0

's [3]' jest '\ 0', więc nie pokazuje żadnego –

Odpowiedz

9

Nie kontynuuje sekwencji. Wykonujesz numer *s+3, który najpierw odznacza s, podając char o wartości 'a', a następnie dodajesz do tej wartości char. Dodanie 3 do 'a' daje wartość 'd' (przynajmniej w twoim zestawie znaków wykonawczych).

Jeśli zmienisz je na *(s+1) itd., Otrzymasz niezdefiniowane zachowanie, które jest oczekiwane.

s[3] uzyskuje dostęp do ostatniego elementu ciągu, który jest pusty.

+0

masz! dzięki! – zalyahya

+5

Jedna wskazówka - '" abc "' często nie jest dobrym ciągiem testowym - zbyt łatwo jest uzyskać oczekiwany wynik (lub coś myląco związanego) przypadkowo z niepoprawnego kodu. – Steve314

2

Zauważ, że *s jest postacią, która jest w zasadzie liczbą. Dodanie do niego kolejnego numeru powoduje otrzymanie znaku o wyższej wartości ASCII. Numer s[3] jest pusty, ponieważ przypisano tylko "abc" odpowiednio do wpisów 0,1,2. W rzeczywistości trzecia postać to znak "\ 0".