首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cout << cstring;打印cstring元素的值,而不是cstring十六进制地址。为什么?

cout << cstring;打印cstring元素的值,而不是cstring十六进制地址。为什么?
EN

Stack Overflow用户
提问于 2015-10-24 20:09:02
回答 1查看 1.4K关注 0票数 2

我理解字符数组与cstring不同,因为cstring中包含后缀\0前哨值。但是,我也理解,对于cstring、chars数组或任何其他类型的数组,程序中的数组标识符是指向数组的指针。所以,下面是完全有效的。

代码语言:javascript
复制
char some_c_string[] = "stringy";
char *stringptr;
stringptr = some_c_string; // assign pointer val to other pointer

我不明白的是,为什么std::cout会自动假设我希望输出cstring或字符数组中的每个元素的值,而不是十六进制地址。例如:

代码语言:javascript
复制
char some_c_string[] = "stringy"; // got a sentinel val
char charArray[5] = {'H','e','l','l','o'}; // no space for sentinel val \0
char *stringptr;
stringptr = some_c_string;
int intArray[3] = {1, 2, 4}; 

cout << some_c_string << endl << charArray << endl
     << stringptr << endl << intArray << endl;

将导致输出:stringy Hello stringy 0xsomehexadd

因此,对于cstring和char数组,std::cout给出了每个元素的值,而不是与int数组一样的十六进制地址。为了方便起见,我想这成为了C++中的一个标准。但是,当这成为标准的时候,能不能请人扩展一下。2) std::cout如何区分char/cstring和其他数组。我猜它使用sizeof()来查看它是一个由单个字节组成的数组,每个数组元素的值是一个ASCII值,用于标识chars/cstring数组。

谢谢!:D

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-24 20:24:31

没有什么好想象的。operator<<char*提供了一个特殊的重载,因此您可以执行std::cout << "Hello World";。从c++的第一天起就这样了。

对于除char*之外的任何内容,指针地址都显示为十六进制。如果您想显示char*的地址,只需将其转换为void*

代码语言:javascript
复制
std::cout << (void*)"Hello World";
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33322787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档