为什么打印 c 样式字符串的“索引 n 的地址”会导致子字符串的输出

Vac*_*ant 1 c++ pointers cout char ostream

我对 C++ 比较陌生,在使用指向 char 数组(C 样式字符串)的指针时,我对其与 ostream 对象的行为感到困惑。

const char* items {"sox"};
cout << items << endl;
cout << items[0] << endl;
cout << *items << endl;
cout << &items << endl;
cout << &items[1] << endl;
Run Code Online (Sandbox Code Playgroud)

运行这会导致:

sox
s
s
0x7fff2e832870
ox
Run Code Online (Sandbox Code Playgroud)

与其他数据类型的指针相反,打印变量不输出地址,而是作为一个整体输出字符串。据我了解,这是由于<<运算符为char 数组重载以将它们视为字符串。

我不明白的是,cout << &items[1]从索引 1 开始打印字符串 ( ox),而不是索引 1处的地址char。这也是由于<<运算符重载还是这种行为的原因是什么?

Pau*_*ers 5

的类型&items[1]const char *。因此使用了const char *重载,operator <<从索引 1 开始打印字符串。

OTOH,&itemsis的类型const char **,不存在特定的重载,因此items打印了 的地址(通过const void *重载)。