打印数组元素内存地址C和C ++,为什么输出不同?

时间:2011-06-04 22:43:18

标签: c++ c memory memory-management

  

可能重复:
  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]);
}

我收到了内存地址:0xbfbe33120xbfbe33130xbfbe3314...

但是如果我尝试在C ++中做同样的事情:

char array[10];
for(int i =0; i<10;i++){
    std::cout<<&array[i]<<std::endl;
}

我得到了这个输出:

  

     


  
  

     

ķ
  
  
  

为什么会有所不同?我应该在C ++中以不同的方式使用cout来打印出内存地址吗?我该如何打印出内存地址?

4 个答案:

答案 0 :(得分:8)

在打印之前将地址转换为void*,在C ++中operator<<的{​​{1}}重载ostream,以便它认为它是c风格的字符串:

(const) char*

另见this answer of mine

答案 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_castdynamic_castreinterpret_cast)。在这种情况下,static_cast可以胜任。