为什么将字符指针流式传输到 cout 不打印地址
Why does streaming a char pointer to cout not print an address?
>当我打印带有printf()
的字符指针时,它会根据 %u 或 %s 使用转换说明符来决定是应该打印地址还是整个字符串。
但是当我想对cout
做同样的事情时,cout
将如何决定应该在地址和整个字符串之间打印什么?下面是一个示例源:
int main()
{
char ch='a';
char *cptr=&ch;
cout<<cptr<<endl;
return 0;
}
在这里,在我的 GNU 编译器中,cout
正在尝试将 ch 输出为字符串。
如何使用cout
通过cptr
获取ch
地址?
重载分辨率选择用于打印 C 样式字符串的ostream& operator<<(ostream& o, const char *c);
。您希望选择其他ostream& operator<<(ostream& o, const void *p);
。你可能最好在这里有一个演员表:
cout << static_cast<void *>(cptr) << endl;
cout
如果收到char *
,则打印一个字符串,就这么简单。
以下是ostream
operator <<
重载:
ostream& operator<< (bool val);
ostream& operator<< (short val);
ostream& operator<< (unsigned short val);
ostream& operator<< (int val);
ostream& operator<< (unsigned int val);
ostream& operator<< (long val);
ostream& operator<< (unsigned long val);
ostream& operator<< (float val);
ostream& operator<< (double val);
ostream& operator<< (long double val);
ostream& operator<< (const void* val);
ostream& operator<< (streambuf* sb);
ostream& operator<< (ostream& ( *pf )(ostream&));
ostream& operator<< (ios& ( *pf )(ios&));
ostream& operator<< (ios_base& ( *pf )(ios_base&));
ostream& operator<< (ostream& out, char c );
ostream& operator<< (ostream& out, signed char c );
ostream& operator<< (ostream& out, unsigned char c );
//this is called
ostream& operator<< (ostream& out, const char* s );
ostream& operator<< (ostream& out, const signed char* s );
ostream& operator<< (ostream& out, const unsigned char* s );
如果需要地址,则需要:
ostream& operator<< (const void* val);
所以你需要投射到const void*
.
我只是把它投射到一个空白*,这样它就不会试图将其解释为 C 字符串:
cout << (void*) cptr << endl;
但是,更安全的选择是使用 dirkgently 答案中的static_cast(这样至少在编译时检查了强制转换)。
正如Luchian所说,cout知道根据类型打印什么。如果要打印指针值,则应将指针转换为 void*,该指针将作为指针插入。
相关文章:
- 如何在逗号后使用 cout 打印整数值,而无需在逗号后添加额外的零C++?
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- cout 打印内存地址而不是值
- cout 打印不准确的结果,printf 打印准确的结果
- cout 打印的字符 [] 包含的字符数超过设置长度
- cout 打印的值不正确
- 无法使用Ostream打印,但可以使用COUT打印
- C 代码cout打印而不是等待在字符串中使用它
- 为什么 cout 打印"2 + 3 = 15"这段代码?
- 为什么std::cout打印非常小的科学符号值,而不是四舍五入到零
- C 基本的自定义COUT打印至consle
- cout.put() 是否推荐使用 cout<< 打印字符
- 尝试使用 cout 打印矢量中包含的对象列表并排序是错误的
- 使用 cout 打印一个(浮点)小数
- 用std :: cout打印零填充的十六进制
- 为什么我的cout打印两次
- 按相反顺序进行cout打印
- C++ cout 打印两次在循环中做
- lodpng正在向cout打印“1”,如何停止它
- 如何在C++中使用 cout 打印带有 2 位小数的浮动