打印数组元素内存对应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*重载了ostreamoperator<< ,因此它认为它是一个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_castdynamic_castreinterpret_cast )。 在这种情况下, static_cast可以完成这项工作。