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

3
以下代码会打印整个字符串。我不明白为什么会这样做。
char test[] = "jeff";
cout<<test<<endl;

输出结果是 "Jeff",我原本期望它打印字符数组 "test" 的值,因为 test 是指针,指针指向第一个元素 'J'。
当我使用 cout<<test 时,为什么它会打印整个字符串?

1
如果 "cout<<test<<endl" 打印了一个地址,你该如何打印文本? - 2785528
请参考此处 - chris
1
test 不是一个指针。 - chris
使用循环。for (auto p = test; *p; ++p) cout << *p; - Benjamin Lindley
@BenjaminLindley 谢谢,但我问了原帖作者如果他的期望是正确的,他会怎么做? - 2785528
显示剩余2条评论
3个回答

7

5
第一个元素是'j',当然,char* 不只是用来表示一个 char,而是表示一串 char 。cout 会一直读取 char 直到发现空字符或 '\0'。当使用字符串字面量如 "jeff" 时,这个空字符会被隐式地放在末尾。
要想仅打印第一个 char,可以对指针进行解引用来获取它,例如 cout<<*test<

2
从技术上讲,“test”并不是“char ”。它会衰减*为“char *”。(我知道您没有明确说明它是一个“char *”,但这种说法有点像在暗示它)。 - Cornstalks
@Cornstalks,你说的“它会腐烂到char*”,是什么意思?“test”不是指向字符串的第一个字符吗? - Harshanand Nyshadham
@Cornstalks 你说得很对。我忽略了那个细节,因为在问题中Harshanand似乎已经确定了那一点。 - Gutblender
2
@HarshanandNyshadham:从技术上讲,“test”是一个数组(就像chris提到的那样)。它的类型是“char [5]”。 - Cornstalks
我会毫不犹豫地干掉所有这些“技术上”的东西。混淆数组和指针从来都不是什么好事。 - chris
显示剩余6条评论

1
在C++(和C)中,字符串被建模为以NUL结尾的字符数组。也就是说,最后一个字符的序数值为0,在你的例子中,它是插入到"jeff"中最后一个"f"之后的索引4的字符,由编译器立即插入。因此,在许多情况下,指向"char"的指针被认为是以NUL结尾的;在这种情况下,"cout"会继续打印字符,直到它到达末尾的NUL字符,然后停止。C++还有一个实际的字符串类"std::string",在许多方面优于char数组。

如果您想与 C 库交互并需要一个 char*,只需调用 std::string.c_string() 实例方法。提到 std::string 类将获得 +1 分。 - Cole Tobin

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