2011-09-16 5 views
6

std::string의 각 문자의 주소를 인쇄하려고했습니다. 그러나 나는 내부적으로 어떤 일이 일어나고 있는지를 이해하지 못하고 있는데, 그 이유는 배열의 경우 예상대로 주소를 제공하는 동안 std::string이 결과로 발생합니다. 누군가가 무슨 일이 일어나는지 설명해 주시겠습니까?std :: string의 각 문자의 주소

#include <iostream> 
#include <string> 

using namespace std; 

int main(){ 

    string str = "Hello"; 
    int a[] = {1,2,3,4,5}; 

    for(int i=0; i<str.length(); ++i) 
     cout << &str[i] << endl; 

    cout << "**************" << endl; 

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

    return 0; 
} 

출력 :

Hello 
ello 
llo 
lo 
o 
************** 
0x7fff5fbff950 
0x7fff5fbff954 
0x7fff5fbff958 
0x7fff5fbff95c 
0x7fff5fbff960 
+1

첫 번째 시도를 사용할 수 있습니다, 이는 C 스타일의 문자열을 인쇄하려고 시도 할 것임을 의미합니다 ('\ 0'을 치거나 가질 필요가없는 주소에 닿을 때까지). 두 번째로하는 일은'int' 배열을 실행하고'int *'주소를 출력하는 것입니다. 또한'std :: string'은'NULL'으로 끝나기 때문에 실제 코드에서는 사용하지 않도록주의하십시오. – birryree

+1

차이점은 std :: string 때문이 아니라 std :: ostream에 대한'char *'와'int *'사이의 다른 출력 논리 때문입니다. – Thomson

답변

13

std::ostreamchar* 그것은 C 스타일 문자열의 가정 인쇄하려고합니다. 인쇄하기 전에 void*

는 캐스트를 당신은 당신이 기대하는 것을 얻을 것이다 :

cout << (void*) &str[i] << endl; 
+0

'void '는 유형이 없음을 의미합니까? 그리고 나서'cout'은 메모리 주소를 사용합니까? – jpenna

+1

우리는'char *'이라는 것을 잊어 버리는'void *'('*': 포인터)를 사용합니다. 'cout'가'char *'을 보면 C 스타일의 문자열 (즉, 다음 null 바이트까지'char' 배열)로 인쇄하려고합니다. 'cout'이'void *'를 본다면, 그것이 가리키는 주소를 출력 할 것입니다. – mange

1

또는 당신이`의 char *를`인쇄 기존의 printf

printf("\n%x",&s[i]); 
관련 문제