2013-05-11 2 views
5

왜 프로그램이,은 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); 

다음과 같은 결과를 주는가를 증가?

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' 

컴파일러는 어떻게 시퀀스를 계속 했습니까? 그리고 s[3]은 왜 빈 값을 반환합니까?

+5

우선 순위. 당신은'* (s + 1)'등을 원한다. 그러나'* (s + 4)'는 정의되지 않은 행동이다. –

+0

's [3]'은 '\ 0'문자를 끝내는 문자열 인 4 번째 문자 (0부터 색인화 됨)를 반환합니다. –

+0

's [3]'은'\ 0'이므로 아무 것도 보여주지 않습니다. –

답변

9

시퀀스를 계속 진행하지 않습니다. 먼저 을 수행하여 char 값이 'a's을 먼저 참조한 다음이 값을 char 값에 추가합니다. 'a'에 3을 더하면 'd' 값을 갖습니다 (적어도 실행 문자 세트에서는).

*(s+1) 등으로 변경하면 예상하지 못한 동작이 발생합니다.

s[3]은 널 문자 인 문자열의 마지막 요소에 액세스합니다.

+0

그것을 얻었습니다! 감사! – zalyahya

+5

팁 -''abc ''는 종종 좋은 테스트 문자열이 아닙니다. 실수로 잘못된 코드에서 예상되는 결과 (또는 혼란스럽게 닫는 문구)를 얻는 것이 너무 쉽습니다. – Steve314

2

*s은 본질적으로 숫자 인 문자입니다. 다른 숫자를 추가하면 ASCII 값이 더 높은 문자가됩니다. s[3]은 항목 0,1,2에 각각 "abc"를 할당했기 때문에 비어 있습니다. 사실 세 번째 문자는 '\ 0'문자입니다.