2011-11-25 3 views
4

아래 INT와 문자 배열의 차이점은 무엇입니까 :int 배열과 char 배열의 차이점은 무엇입니까?

int main() 
{ 
    int numbers[] = {2,1,3}; 
    char letter[] = {'a','b','\0'}; 
    cout<< numbers<<endl; 
    cout<< letter<<endl; 
} 

출력 : 왜 213

0x22ff12 // an address 
ab 

표시되지 않는 이유는 무엇입니까? 배열의 이름이 첫 번째 요소의 주소를 가리키는 것을 알고 있지만 문자 배열이 다른 동작을 표시하는 이유는 무엇입니까?

+4

, 대부분의 상황에서 자신의 첫 번째 요소에 대한 포인터로 배열 붕괴 ...하지만 'cout'과'<<'와'endl'는 C 언어에서 인식 할 수없는 요소입니다. – pmg

+0

글쎄 ... 내 말은 : C에서'<< "는 비트 시프트 왼쪽 연산자이고 인식 할 수없는 언어 요소에는 사용할 수 없다. – pmg

답변

8

은 각각 void*char*에, 배열에 포인터 변환을 받아야 당신이 전달하는 인수 (예 : numbersletter) 때문에, 정확하게, 배열을 취하는 operator<< 과부하가 없습니다.

const void*을 사용하는 operator<<()의 오버로드와 const char*을 사용하는 오버로드가 있습니다. 전화 할 때 :

cout<< numbers<<endl; 

const void* 버전은 일치하지만 호출하면된다

cout<< letter<<endl; 

const char* 버전이 일치합니다.

const void* 버전에서는 const char* 버전 인 경우 포인터가 표시되며 null 종결 자까지 문자열이 표시됩니다.

+0

@dlev : 편집 해 주셔서 감사합니다. –

+1

은 사실이므로 다른 답변도 읽어보십시오. –

1

C/C++에서 배열은 실제로 첫 번째 요소에 대한 포인터입니다. 포인터는 값이 저장된 주소를 보유합니다. 따라서 포인터 번호를 인쇄하면 첫 번째 값 (2)이 메모리에 저장되는 주소가 표시됩니다.

char *는 예외입니다. 인쇄하려고하면 문자열로 작동하기 때문입니다.

+2

배열은 포인터가 아니다. 그것들은 많은 문맥에서 포인터에 대해 부패하지만 그것으로 그것들을 똑같이 만들지 않는다. – dlev

7

cout으로 배열을 인쇄하면 배열의 기본 주소가 인쇄됩니다.

예외는 char 배열을 C 문자열로 인쇄하도록 오버로드되었습니다.

int 배열의 요소를 인쇄하려면 요소별로 수행해야합니다.

+0

왜 downvote? 내 대답에 문제가 있습니까? – Mysticial

3

char 배열은 내용이 문자열로 표시되는 < < 연산자에 과부하가 있기 때문에 특별합니다.

다른 모든 배열의 주소는 기본적으로 표시됩니다.

+0

답장을 보내 주셔서 감사합니다. –

0

숫자는 포인터입니다. C++의 모든 배열은 실제로 포인터입니다. [3]은 "메모리 주소 & 숫자 + 3"의 값을 의미하므로 첫 번째 요소의 메모리 주소를 숫자로 출력합니다.

4

C 및 따라서 C++에서 문자열은 0으로 끝나는 문자 배열로 표현되는 경우가 많습니다. 따라서 오버로드 된 연산자 < <은 std :: ostream 클래스에 제공되며 그 중 std :: cout은 다음과 같습니다. char *를 문자열로 인쇄하는 인스턴스 이러한 일반적인 int 배열이나 규칙이 없기 때문에 연산자는 출력 할 요소의 수를 알 수 있으므로 배열의 포인터는 해당 주소를 인쇄하여 다른 포인터를 출력하는 연산자 < < 버전과 일치합니다 .

+0

+1 이것은 내가 지금 쓰고 싶었 기 때문입니다. 하지만 두 가지 과부하의 구체적인 기능 프로토 타입을 보여줄 수 있다면 교육적이라고 생각합니다. –

1

코드의 대부분은 C를 참조합니다. char의 배열은 사실 C의 문자열 표현입니다. 반면 C의 배열은 보유하고있는 메모리 셀 (셀의 주소)에 대한 포인터이기도합니다 배열의 최초의 요소

그래서 문자 배열을 출력 할 때 실제로는 C가 그것을 처리하기 때문에 문자열을 출력합니다. 정수 배열을 인쇄 할 때 배열의 첫 번째 요소의 주소를 인쇄합니다.

0

int[] 배열이 끝나는 곳에서 컴파일러가 알아야 할 이유는 없지만 전통 및 표준 라이브러리는 C 문자열이 null로 끝나는 char[] 배열을 지정합니다. null로 끝나는 int[] 배열에 대해서는 그러한 전통이나 라이브러리 지원이 없습니다.

이 기능이 필요한 경우 C++ pretty 프린터 templates이 있습니다. 나는 유형이 실제로 바운드를 알고있을 때 배열의 경계를 사용한다는 것을 막연하게 상기합니다. 즉 []이 아닌 [3]을 사용하기 때문에 코드가 여전히 작동하지 않습니다.

그냥 operator<<에 과부하가 걸릴 수도 있지만 []을 STL 내부 [3]으로 바꾸면 코드를 수정할 수 없습니다.

+0

템플리트 매개 변수에 C 배열 경계를 사용할 때주의가 필요합니다. http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage% 2Fref % 2Fclrc16deduct_non-type.htm –

4

이유는 const char*에 대해 operator<<이 오버로드되어 각 문자가 \0에 도달 할 때까지 인쇄하기 때문입니다.

이러한 과부하는 각 요소를 인쇄하는 int[N]에 해당하지 않습니다. 대신 cout << numbers을 쓸 때 void*에 오버로드되어 주소를 인쇄하는 operator<<을 호출합니다.

operator<<T[N]을 오버로드하면 마찬가지로 인쇄 할 수 있습니다. 여기

간단한 그림 :

template<typename T, size_t N> 
std::ostream & operator<<(std::ostream & out, const T (&a)[N]) 
{ 
    for(size_t i = 0 ; i < N ; ++i) 
     out << a[i] << ' '; 
    return out; 
} 

int main() 
{ 
    int numbers[] = {2,1,3}; 
    char letter[] = {'a','b','\0'}; 
    cout<< numbers<<endl; 
    cout<< letter<<endl; 
} 

출력 :

2 1 3 
a b 

데모 : C에서 http://ideone.com/O4T9N

+1

+1 놀랍게도 이미 투표했습니다. 이유와 방법을 보여줍니다. –

관련 문제