使用std :: cout时如何模拟printf的%p格式?

时间:2011-04-14 00:06:23

标签: c++ gcc iostream

unsigned char *teta = ....;
...
printf("data at %p\n", teta); // prints 0xXXXXXXXX

如何使用iostream打印变量地址?有std:: ???像std::hex这样的功能可以执行此类转换(地址 - &gt;字符串),因此std::cout << std::??? << teta << std::endl会打印该地址吗?

(没有sprintf,请;))

2 个答案:

答案 0 :(得分:27)

转换为void*

unsigned char* teta = ....;
std::cout << "data at " << static_cast<void*>(teta) << "\n";

iostream通常假设你有一个带有任何char*指针的字符串,但void*指针就是那个 - 一个地址(简化),所以除了转换那个地址之外,iostream不能做任何事情到一个字符串,而不是该地址的内容。

答案 1 :(得分:1)

根据您是否想要使用printf提供的更多格式选项,您可以考虑使用sprintf

通过它,您可以像使用printf一样格式化字符串,然后使用std::cout打印出来

但是,这将涉及使用临时char数组,因此选择取决于。

一个例子:

unsigned char *teta = ....;
...
char formatted[ 256 ]; //Caution with the length, there is risk of a buffer overflow
sprintf( formatted, "data at %p\n", teta );
std::cout << formatted;