2014-07-16 1 views
2

C++의 포인터와 배열을 이해하려고합니다. 다음 코드에서 a 출력은 array의 첫 번째 요소의 주소를 올바르게 표시하지만 c을 출력하면 주소가 아닌 pk이됩니다.C++에서 문자 배열 대 정수 배열의 포인터

int array[3]={4,7,2}; 
int * a; 

a= array; 

char Carray[3]={'p','k','\0'}; 
char * c; 

c= Carray; 

cout << a << "\n"; 
cout << c << "\n"; 

Carray의 첫 번째 요소의 주소를 찾을 수있는 잘못된 방법이 있나요? 또는 정수형 및 문자 배열에 대한 포인터를 해석하는 방법에 대한 약간의 변덕입니다. cout

출력 :

Ox23fe30 
pk 
+0

이러한 진술에서 얻은 결과를 알려주십시오. – turbulencetoo

+0

C 스타일 문자열은 널 문자'\ 0'으로 끝나는'char' 배열이고,'cout'은 C 스타일 문자열을 전달한다고 가정합니다. 따라서 첫 번째 요소의 주소를 가져 오는 방법은 정확하지만 'int'와 'char'의 경우 'cout'의 주소 해석이 다릅니다. –

+0

특별히 C와의 비교를 요구하지 않는 한, C++ 질문에 C로 태그를 지정하지 마십시오. 언어와 관용적 대답은 매우 다를 수 있습니다. – crashmstr

답변

0

cout 그래서 첫 번째 배열 요소의 주소를 얻기의 당신의 방법이 괜찮습니다, INT 포인터 말을 다른 방법으로 문자 포인터를 해석합니다.

1

C에서 "quirk"입니다. C에서 문자 문자열은 null로 끝나는 char[]입니다. cout은 C 스타일 문자열 사용을 허용하므로 문자열 인 것처럼 문자 포인터를 출력합니다.

6

cout문자 배열에 대한 포인터를 해석하는 방법의 단점입니다.

포인터가 주어진 경우 coutchar*이 아닌 경우 주소를 인쇄합니다.이 경우 포인터는 C 스타일 문자열 (null 배열이되는 문자 배열에 대한 포인터)로 해석됩니다. cout << reinterpret_cast<void*>(c) << "\n";c

5

, 당신은 operator<<(std::istream&, char*)를 호출하고 있습니다 :

먼저 void*에 캐스팅, char 배열의 주소를 인쇄합니다. 보통의 C 스타일 문자열처럼 '\0'에 도달 할 때까지 문자를 인쇄합니다.

a이면 operator<<(std::istream&, int*)이 주소를 인쇄합니다.

+0

기술적으로 오버로드가'operator << (std :: istream &, void *)'라고 생각합니다. –

0

char 포인터는 일반적으로 C 및 C++에서 NULL 종료 문자열로 처리됩니다. cout과 같은 STL 스트림의 경우 char 포인터는 확실히 NULL로 끝나는 문자열로 처리됩니다.