2011-09-16 17 views
6

Ben std::string her karakterin adresini yazdırmak için çalıştı. Ama beklendiği gibi diziye için adresini vererek iken bu çıktıyı çıkan edilir std::string ile dahili olarak neler olduğunu anlamak amn't. Birisi neler olduğunu açıklayabilir mi lütfen?Adres :: dize

#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; 
} 

Çıktı:

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

ilk denemeden kullanabilir, hangi (o '\ 0' vurur veya olmamalıdır bir adres temas edene kadar) o C tarzı dize yazdırmak için çalışacağım anlamına gelir. Yaptığınız ikinci şey sadece bir dizi “int” ile çalışıyor ve int * 'adresini yazıyor. std :: string' NULL' sonlandırılmış 'olması garanti edilmez' Ayrıca, çünkü gerçek kodda eski kullanmamaya dikkat edin. – birryree

+1

Buradaki fark, std :: string tarafından değil, std :: ostream için char * 've' int * 'arasındaki farklı çıkış mantığından kaynaklanmıyor. – Thomson

cevap

13

bir std::ostream bir char* o C tarzı dizesi var varsayar yazdırmaya çalışır. yazdırmadan önce bir void* için

Cast onu ve size beklediğiniz alacak:

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

'void', türü yok demektir? Ve sonra 'cout' hafıza adresini kullanıyor? – jpenna

+1

Biz kullanmak 'void *' ('*' not: bu kadar bir işaretçi) o 'a Char * bu kadar "unutmak" için. 'Cout' bir' char * görürse 'o zaman bir C tarzı dizesi olarak yazdırmak için çalışacağız (yani. Bir dizi' sonraki boş byte kadar char's). Eğer 'cout' bir void * 'görürse, işaret ettiği adresi basacaktır. – mange

1

veya bir `char *` yazdırmak için eski printf

printf("\n%x",&s[i]);