2013-05-11 32 views
5

Neden programı,C Char işaretçiler ++

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); 

aşağıdaki sonuçları veriyor artırım yapılması?

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' 

Derleyici sıralamaya nasıl devam etti? Ve neden s[3] boş bir değer döndürüyor?

+5

Öncelik. İstediğiniz * (s + 1) 'vb. Ama' * (s + 4) 'undefined davranışı olacaktır. –

+0

's [3]', '\ 0' karakterini sonlandıran bir dize olan 4'üncü karakteri (0'dan dizinlenmiş) döndürür. –

+0

'ın [3]' '\ 0', bu yüzden ben bu Öğe 5 çıktının şüpheci hiçbiri –

cevap

9

Bu diziyi devam etmez. İlk dereferences s size değer 'a' ile char vermek için hangi *s+3 yapıyoruz ve sonra bu char değere üzerine ekliyoruz. 3'e 'a' eklemek, 'd' değerini verir (en azından yürütme karakter kümenizde).

Eğer *(s+1) bunları değiştirirseniz ve benzeri, beklenen tanımsız davranış alırsınız.

s[3] boş karakter dizesinin son öğe erişir. *s aslında bir sayıdır bir karakter olduğunu

+0

anladı! Teşekkürler! – zalyahya

+5

Bir ipucu - '" abc "' genellikle iyi bir test dizgisi değildir - yanlışlıkla hatalı koddan beklenen sonucu (veya kafa karıştırıcı bir şekilde kapanması) almak çok kolaydır. – Steve314

2

dikkat edin. Başka bir numara eklemek, daha yüksek ASCII değerine sahip bir karakterle sonuçlanır. s[3] boştur, çünkü sırasıyla 0,1,2 girişlerine yalnızca "abc" atanmıştır. Aslında 3 karakter '\ 0' karakteridir.