char *数组元素访问混乱

时间:2019-01-12 21:21:55

标签: c++ arrays pointers

我正在学习c++并遇到了这个问题:

#include<iostream>
using namespace std;
int main(){

const char *a[] = {"ge","hy"};
cout<<a<<" "<<&a[1]<<endl;
cout<<a[0]<<" "<<a[1];
return 0;
}

输出为:

0x7fff54e71830 0x7fff54e71838
ge hy

我试图理解代码。

这是我的理解:

a是一个array字符指针,这意味着数组的每个元素都是一个char指针。

现在,由于每个元素都是一个指针,因此它应该分别存储“ ge”和“ hy”的地址。

         -----------------------------------
 a  =    | 0x7fff54e71830 | 0x7fff54e71838 |
         -----------------------------------

现在,当我写a[0]a[1]时,为什么要打印ge hy而不是它们的内存地址,因为数组a会存储它们的地址而不是它们的地址实际值。

我肯定我会在某个地方出错,因为输出与预期不符。请在这里纠正我。

1 个答案:

答案 0 :(得分:3)

标准库提供了一个重载的operator<<(std::ostream&, const char*)来打印C样式的字符串,该字符串将打印所指向的字符串而不是指针本身的值。该重载比operator<<(std::ostream&, void*)重载(打印存储在指针中的地址)更好。

如果要打印指针的值,请将强制类型转换添加到void*

std::cout << static_cast<void*>(a[0]) << ' ' << static_cast<void*>(a[1]) << '\n';

Live Demo