2011-09-16 26 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::ostream試圖打印char*它假定它是一個C風格的字符串。

其轉換爲void*打印之前,你會得到你所期望的:

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

'void'表示它沒有類型?然後'cout'使用內存地址? – jpenna

+1

我們使用'void *'(注意'*':它是一個指針)來「忘記」它是'char *'。如果'cout'看到一個'char *',那麼它會嘗試將它打印爲一個C風格的字符串(即一個'char'數組,直到下一個空字節)。如果'cout'看到一個'void *',它會打印它指向的地址。 – mange

1

,或者您可以使用舊的printf

printf("\n%x",&s[i]); 
相關問題