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