2012-02-12 2 views
10

이 간단한 스크립트를 작성하여 참조가 무엇인지 이해했으며 char 배열을 고수하게되었습니다. I는 &numbers[i] 사용할 때, I는 메모리 위치 이상한 번호가 접수 상기 int 배열char 참조 이해

3 
0xbffff958 
6 
0xbffff95c 
9 
0xbffff960 
12 
0xbffff964 
15 
0xbffff968 
-------------- 
a 
abcde 
b 
bcde 
c 
cde 
d 
de 
e 

:

int numbers[5] = {3, 6, 9, 12, 15}; 

for (int i = 0; i < 5; i++) 
{ 
    cout << numbers[i] << endl; 
    cout << &numbers[i] << endl; 
} 

cout << "--------------" << endl; 

char letters[5] = {'a', 'b', 'c', 'd', 'e'}; 

for (int i = 0; i < 5; i++) 
{ 
    cout << letters[i] << endl; 
    cout << &letters[i] << endl; 
} 

는이 출력된다. 괜찮아. 그것은 내가 정확히 이해 한 것입니다.

그러나 char을 사용하는 이유는 무엇입니까?

+1

나는 두 번째 부분이 지옥과 등을 모두 깨뜨리지 않았다고 놀랍다. 코드가 말한대로 '글자'는 끝이 아닌 것으로 간주한다. 그러나 UB는 "프로그램이 작동하는 것조차도 모든 일이 발생할 수 있습니다."라는 의미입니다. – cHao

+2

@cHao : 일부 컴파일러는 디버그 모드로 컴파일 할 때 제로를 초기화합니다. 아마 OP는 "행운"이었다. –

+1

나는 아직 아무도 이것을 언급 한 것이 놀랍다. 그러나 이것은 참고 문헌과는 아무 관련이 없다. 당신은 포인터에 대해 이야기하고 있습니다. –

답변

13

그 이유는 coutchar * 값으로 무엇을 할지를 "아는"것입니다. 그 이유는 문자열을 NUL 종료 C 문자열로 인쇄하기 때문입니다.

int * 값은 같지 않으므로 cout 대신 포인터 값이 인쇄됩니다.

당신은 주조에 의해 포인터 값 출력을 강제 할 수 있습니다 : 당신은 C++ 스트림의 특수성에서 찾고있다

cout << static_cast<void *>(&letters[i]) << endl; 
2

. 인수를 보통 인쇄 가능한 것으로 변환하려고합니다. 이 식의 형식은 &ints[x]int*입니다. &chars[x]char*이되며, 우연히 C 문자열의 유형이기도합니다. 우리가 이것을 cout << "FOO"' 전체 문자열을 출력하기를 원할 때,이 동작이 필요합니다. 귀하의 경우에는 사용중인 문자열이 제대로 null로 끝나지 않아 실제로 정의되지 않은 동작이 발생합니다. 이 문제를 해결하려면 static_cast을 사용하십시오.

2

의 인수 인 ostream::operator<< (실제로는 전역 함수, 연산자가 아님)에 전달하면 null로 끝나는 문자열로 간주됩니다.

+0

표준은 ASCII 여야한다고 지정하지 않습니다. –

+0

@MattiVirkkunen 감사합니다! –