我试图理解C ++中的指针和数组。我注意到在以下代码中正确输出a
会给出array
中第一个元素的地址,但是输出c
会给出pk
而不是地址。
int array[3]={4,7,2};
int * a;
a= array;
char Carray[3]={'p','k','\0'};
char * c;
c= Carray;
cout << a << "\n";
cout << c << "\n";
这是找到Carray
中第一个元素的地址的错误方法吗?或者这是cout
如何解释整数和字符数组指针的一些怪癖。
输出:
Ox23fe30
pk
答案 0 :(得分:6)
这是cout
如何解释字符数组指针的一个怪癖。
当给出指针时,cout
将打印地址,除非它是char*
,在这种情况下,它将指针解释为c样式字符串(指向字符数组的指针结束将是一个空字节)。
要打印字符数组的地址,请先将其转换为void*
:cout << reinterpret_cast<void*>(c) << "\n";
答案 1 :(得分:5)
使用c
,您正在呼叫operator<<(std::istream&, char*)
。只打印字符直到它到达'\0'
,就像常规的旧C风格字符串一样。
使用a
,operator<<(std::istream&, int*)
打印地址。
答案 2 :(得分:1)
这是来自C的“怪癖”。在C中,字符串是以空值终止的char[]
。 cout
允许使用C风格的字符串,因此它将字符指针输出为字符串。
答案 3 :(得分:0)
cout
以不同于int指针的方式解释char指针,所以你获取第一个数组元素地址的方法还可以。
答案 4 :(得分:0)
指向char的指针通常被视为C和C ++中以NULL结尾的字符串。对于诸如cout之类的STL流,char指针肯定被视为以NULL结尾的字符串。