C++字符指针cout输出为何显示字符串而非地址?
为什么
cout << p输出的是字符串而不是指针地址? 这是个非常典型的C++流操作重载问题,我来给你掰扯清楚:
首先你得明白,C++的std::cout对char*类型做了特殊处理——当你把一个char*指针传给cout时,它不会输出指针本身的内存地址,而是默认把这个指针当成字符串的起始位置,从这里开始逐个输出字符,直到碰到字符串结束符'\0'才停下。
结合你的代码具体分析
先看你写的这段代码:
char str[] = "we are poor students"; cout << str << endl; char *p = str; while (*p != '\0') { cout << p << endl; p++; } return 0;
- 一开始
p指向str的第一个字符'w',所以cout << p会直接输出从'w'开始到'\0'的完整字符串; - 每次循环里
p++会让指针向后移动一个字符的位置,下一次输出就从新的指针位置开始往后读,直到'\0',这就导致了你看到的那种逐段缩短的字符串输出结果。
要是想输出char*的实际地址怎么办?
如果你确实想看到指针的内存地址,只需要把char*强制转换成**无类型指针void***就行,因为cout对void*的处理是输出它的地址值:
cout << static_cast<void*>(p) << endl;
把你代码里的cout << p换成上面这句,就能看到每次p的真实内存地址了。
额外补充:其他类型指针的表现
像int*、float*这类非字符指针,cout就会直接输出它们的内存地址,因为标准库没给这些类型做类似char*的特殊重载,只会按照指针的默认规则输出地址值。
内容的提问来源于stack exchange,提问作者JianYuan Kou
相关产品推荐
相关产品推荐

