2011-03-07 6 views
0

코드는 // 경우주소 값

char str[]="hello";  
char *sptr=&str[2]; 
cout<<sptr; 

// 출력이
LLO 16 진수 값 만이 아닌 .... 그 이유는 무엇입니까?
은 또한 다음 코드 우리가하는 array1을 인쇄하는 경우, 그것은 안녕하세요 세계로 인쇄됩니다 //

char array[]="hello world"; 
char array1[11]; 
int i=0; 
while(array[i]!='\0') 
{array1[i]=array[i]; 
i++;} 

을 고려 //하지만 안녕과 세계 사이의 공간이 발생할 때이를 중지해야합니다.

+1

문자열은'\ 0' 종료되며''-terminated (= space-terminated)가 아니기 때문에'hello'에서 멈춰야하는 이유는 무엇입니까? – phimuemue

답변

4

출력 스트림에서 사용되는 operator<< 오버로드에 const char*이 오버로드되어 문자열 리터럴과 C 문자열을 자연스럽게 출력 할 수 있습니다. 당신이 주소를 인쇄하려면

, 당신은 const void* 포인터를 캐스팅 할 수 있습니다

std::cout << static_cast<const void*>(sptr); 

를 두 번째 문제에서, \0는 null 종결 문자이다 : 문자열을 종료하는 데 사용됩니다. array은 실제로 "hello world\0"을 포함하므로 루프가 문자열의 끝에 도달 할 때까지 루프가 중지되지 않습니다. helloworld 사이의 문자는 공백 문자 (아마도) ' '입니다.

1
  1. char*을 인쇄하면 문자열로 인쇄됩니다. charstd::cout에 자사의 텍스트 표현 저점으로 전화를 해석, 기본적으로

    :

  2. '\0'은 첫 번째 질문에 대해서는 ' '

0

없습니다. c이 캐릭터이다

std::cout << std::hex << static_cast<int>(c); 

: 당신이 출력에 문자의 16 진수 표현을 원하는 경우에

는 다음 코드를 사용합니다. 코드에서

:

cout<<sptr; 

sptr이 char포인터 아닌 char는 C-문자열로 너무 std::cout 표시를합니다. 두 번째 질문에 대해서는

:

공백이 ASCII 문자 (32)가 아닌 0입니다 따라서 테스트는 복사본의 종료 널 문자를 확인합니다.

0

cout과 관련하여 포인터가 아닌 내용을 인쇄 할 스트림에 const char * (및 char *)를 작성하기위한 특수 오버로드가 있습니다.

array1과 관련하여 실제로 null 바이트를 복사하지 않기 때문에 크기를 11로 만드는 데 아무런 문제가 없습니다. 0 바이트를 찾을 때까지 인쇄를 시도하고 배열 끝을 읽는 것을 의미하므로 인쇄 할 때 문제가 발생합니다.

다음에 오는 것은 int이기 때문에 컴파일러는 몇 바이트를 잘 채울 수 있습니다. 패딩의 1 바이트가 실제로 아무것도 아니지만, 반드시 0 문자가 될 수는 없습니다.

만날 가능성이있는 다음 몇 문자는 int 자체가되며, 엔디안에 따라 0 바이트가 첫 번째 또는 두 번째가됩니다.

기술적으로 정의되지 않은 동작입니다.