2011-09-16 16 views
6

Próbowałem wydrukować adres każdej postaci std::string. Ale nie rozumiem, co się dzieje wewnętrznie z std::string, które powoduje to wyjście, podczas gdy dla tablicy podaje adres zgodnie z oczekiwaniami. Czy ktoś mógłby wyjaśnić, co się dzieje?Adres każdego znaku 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; 
} 

wyjściowa:

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

The próbuje najpierw wydrukować 'char *', co oznacza, że ​​spróbuje wydrukować ciąg w stylu C (dopóki nie dotrze do '\ 0' lub nie dotknie adresu). Drugą rzeczą, którą robisz, jest po prostu przechodzenie przez tablicę 'int' i drukowanie adresu' int * '. Należy również uważać, aby nie używać pierwszego z nich w rzeczywistym kodzie, ponieważ 'std :: string' nie ma gwarancji, że zostanie zakończone z wartością" NULL ". – birryree

+1

Różnica tutaj nie jest spowodowana przez std :: string, ale spowodowana przez różną logikę wyjściową pomiędzy 'char *' i 'int *' dla std :: ostream. – Thomson

Odpowiedz

13

Kiedy std::ostream próbuje wydrukować char* zakłada, że ​​jest to ciąg C-style.

wrzucił je do void* przed drukowaniem, a dostaniesz to, czego się spodziewać:

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

'void' oznacza, że ​​nie ma typu? A potem 'cout' używa adresu pamięci? – jpenna

+1

Używamy 'void *' (zauważ, że '*': to wskaźnik), aby "zapomnieć", że jest to 'char *'. Jeśli 'cout' zobaczy' char * 'to spróbuje wydrukować go jako łańcuch w stylu C (tj. Tablicę' char's aż do następnego bajtu null). Jeśli 'cout' zobaczy' void * ', to wydrukuje adres, na który wskazuje. – mange

1

lub można użyć starego printf

printf("\n%x",&s[i]); 
Powiązane problemy