std::cout 如何处理 char 指针?

Posted

技术标签:

【中文标题】std::cout 如何处理 char 指针?【英文标题】:How does std::cout work with char pointers? 【发布时间】:2021-01-09 15:41:06 【问题描述】:

最近我一直在学习 C++ 指针,但我对 char 感到困惑。

char *c = "sampletext";

cout<< *c <<endl;

cout<< c <<endl;

cout<< &c <<endl;

更准确地说:为什么cout<< c <<endl; 打印整个 C 字符串而不是地址(例如,它发生在 int 指针中), 以及为什么cout<< *c <<endl; 打印第一个字母而不是整个 C 字符串。提前谢谢你

【问题讨论】:

经验法则:始终期望char* 与任何其他指针类型的处理方式不同。这来自 C,其中文本表示为以 nul 结尾的字符数组,因此处理文本的所有内容实际上都在char*(或const char*,当然)中传输。所以,很自然地,事情也朝着相反的方向发展:几乎每个char* 都被假定指向一个以空结尾的char 数组。 【参考方案1】:

这是因为编译器检查参数的类型并调用接收该类型的运算符的重载版本。

在 C 语言中,字符串被实现为以 ’\0’ (nul) 字符结尾的 char 数组,并且使用指针引用数组。因此,当接收到的参数是 c 时,接收到 char* 的重载运算符将数组的内容打印到 nul 终止符为止。

当接收到的参数是*c 时,这会取消引用指针以访问其数据,并且由于这是指向char 的指针,因此接收char 的重载运算符将其打印为单个char

要打印字符串数组的地址,可以将char* 指针转换为void*,如下所示:

std::cout << (void*) c << std::endl;

【讨论】:

以上是关于std::cout 如何处理 char 指针?的主要内容,如果未能解决你的问题,请参考以下文章

GTK+ 如何处理指针?

如何处理插入 '\0' 的字符数组?

如何处理向量指针?

GRPC 如何处理出现多次的指针?

如何处理指针成员的不同所有权策略?

如何处理指向通用接口的指针的 JPA 注释