可能重复:
How to simulate printf's %p format when using std::cout?
我尝试用C和C ++打印出数组元素的内存地址。
在C:
char array[10];
int i;
for(i =0; i<10;i++){
printf(" %p \n", &array[i]);
}
我收到了内存地址:0xbfbe3312
,0xbfbe3313
,0xbfbe3314
,...
。
但是如果我尝试在C ++中做同样的事情:
char array[10];
for(int i =0; i<10;i++){
std::cout<<&array[i]<<std::endl;
}
我得到了这个输出:
点
ķ
为什么会有所不同?我应该在C ++中以不同的方式使用cout
来打印出内存地址吗?我该如何打印出内存地址?
答案 0 :(得分:8)
在打印之前将地址转换为void*
,在C ++中operator<<
的{{1}}重载ostream
,以便它认为它是c风格的字符串:
(const) char*
答案 1 :(得分:1)
&array[i]
的类型为char*
,因此cout<<
认为您要打印字符串。
答案 2 :(得分:1)
std::cout
并不一定将指针视为指针。例如,char*
指针可以是string
。获取char
数组中元素的地址基本上从该点输出子字符串。
答案 3 :(得分:0)
您必须将&array[i]
投射到void*
for(int i =0; i<10;i++){
std::cout<<(void*)&array[i]<<std::endl;
}
这是因为C ++流对不同类型的工作方式不同。例如,当您将char*
传递给它时,您的数据将被视为C字符串 - 因此它将打印为字符列表。
您必须明确告诉C ++您要通过强制转换来打印地址。
顺便说一下(void*)
不是最好的方法,因为你应该避免像C一样的施法。始终使用C ++风格的转换(static_cast
,dynamic_cast
,reinterpret_cast
)。在这种情况下,static_cast
可以胜任。