Адрес каждого символа 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

person Mahesh    schedule 16.09.2011    source источник
comment
Первый пытается напечатать char*, что означает, что он попытается напечатать строку в стиле C (пока не наткнется на \0 или не коснется адреса, которого у него быть не должно). Второе, что вы делаете, это просто просматриваете массив int и печатаете адрес int*. Также будьте осторожны, чтобы не использовать первое в реальном коде, потому что std::string не гарантируется NULL-завершением.   -  person wkl    schedule 16.09.2011
comment
Разница здесь вызвана не std::string, а разной логикой вывода между char* и int* для std::ostream.   -  person Thomson    schedule 16.09.2011


Ответы (2)


Когда std::ostream пытается напечатать char*, предполагается, что это строка в стиле C.

Приведите его к void* перед печатью, и вы получите то, что ожидаете:

cout << (void*) &str[i] << endl;
person mange    schedule 16.09.2011
comment
void означает, что у него нет типа? И тогда cout использует адрес памяти? - person jpenna; 29.01.2018
comment
Мы используем void* (обратите внимание на *: это указатель), чтобы забыть, что это char*. Если cout увидит char*, то он попытается напечатать его как строку в стиле C (т. е. массив из char до следующего нулевого байта). Однако если cout увидит void*, он напечатает адрес, на который указывает. - person mange; 03.02.2018

или вы можете использовать старый printf

printf("\n%x",&s[i]);
person vivek    schedule 16.09.2011