std::string每个字符的地址

6

我尝试打印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
第一个尝试打印char*,这意味着它将尝试打印C风格的字符串(直到遇到\0或触及不应该有的地址)。你正在做的第二件事只是运行一个int数组并打印地址int*。此外,请注意不要在实际代码中使用前者,因为不能保证std::stringNULL结尾。 - wkl
1
这里的区别不是由std::string引起的,而是由于std::ostream对于char*int*之间不同的输出逻辑所导致的。 - Thomson
2个回答

15

std::ostream 尝试打印 char* 时,它默认为一个 C 风格的字符串。

在打印之前将其强制转换为 void*,您将得到预期的结果:

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

void 意味着没有类型?然后 cout 使用内存地址? - jpenna
1
我们使用 void*(注意 *:它是一个指针)来“忘记”它是一个 char*。如果 cout 看到一个 char*,那么它会尝试将其作为 C 风格的字符串打印出来(即一系列 char 直到下一个空字节)。但是,如果 cout 看到一个 void*,它将打印它所指向的地址。 - mange

1

或者您可以使用旧的printf函数

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接