为什么std::cout可以打印char[]

Why can std::cout print a char[]?

本文关键字:char 打印 std cout 为什么      更新时间:2023-10-16

下面的代码打印整个字符串。我不明白为什么会这样。

char test[] = "jeff";
cout<<test<<endl;

输出是"Jeff",我期望它打印字符数组"test"的值,因为test是指针,指针指向第一个元素'J'。

为什么打印整个字符串,当我cout<<test ??

因为operator<< (basic_ostream<charT,traits>& os, const char* s);(该列表中的#2 "字符序列")(稍微更专业的列表)。test衰减为指针,或者char*,然后被打印为c字符串。

这与cout << "Jeff";工作的原因完全相同(而不是打印"Jeff"的地址)。

第一个元素当然是'j',但是char*并不意味着只表示一个char,而是它们中的stringcout将继续读取char s,直到找到空字符或''。当您使用字符串字面值(如"jeff")时,它会隐式地放在那里。

要只打印第一个char,取消对指针的引用,使其像cout<<*test<<endl;一样。

在c++中(与C中一样),字符串被建模为以空结束的字符数组,即最后一个字符的序数值为0,在您的示例中,它的索引为4的字符,由编译器在"jeff"中的最后一个"f"之后立即插入。因此,在许多上下文中,指向"char"的指针被假定为以空结束;在这种情况下,"cout"继续打印字符,直到它在最后遇到NUL字符,此时它停止。c++还有一个实际的字符串类"std::string",它在许多方面优于字符数组。