C ++中的字符指针

时间:2011-03-11 07:44:59

标签: c++ pointers

嗨,大家好 我对c ++中的字符指针有疑问。每当我们在c ++ char * p =“你好吗”中创建一个字符指针时,p 应该包含内存位置的地址,该位置保存“你好吗”。 但是我对一个samle代码和输出感到困惑。为什么cout<<p会给出整个字符串?它应该给出内存地址的值。其次,cout<<*p为什么只给出字符串的第一个字符?提前致谢! 代码:

#include <iostream>
using namespace std;

int main () {

const char *str = "how are you\n";
int i[]={1,2,3};


 cout << str << endl;   // << is defined on char *.
 cout << i << endl;
 cout << *str << endl;

}

输出:

how are you

0xbfac1eb0

h

4 个答案:

答案 0 :(得分:6)

如果您要打印地址,则必须将char*转换为void*

const char *str = "how are you\n"; 
cout << (void*) str << endl; 

由于演员阵容缺席,coutstr视为const char*(事实上它是这样),所以cout认为您打算打印空终止char字符串!

想一想:如果你想让coud << str打印地址,你会如何打印字符串?

-

无论如何,这里有更详细的解释:

operator<<已为char*以及void*重载:

//first overload : free standing function
basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& _Ostr, const char *_Val);

//second overload : a member of basic_ostream<>
_Myt& operator<<(const void *_Val);

如果没有强制转换,则会调用第一个重载,但是当你转换为void*时,会调用第二个重载!

答案 1 :(得分:5)

这是由于运营商超载造成的。

&lt;&lt; 运算符重载以输出字符指针指向的字符串。

同样,使用* p,您将获得第一个字符,因此您将第一个字符作为输出。

答案 2 :(得分:1)

C字符串只是一串字节,以空字节结束(这是一种约定)。您还可以将其视为一个字节/字符数组。如果执行char *str = "foobar";,编译器会为这些字节保留一些内存,然后将第一个字节/字符的内存位置分配给str

因此,如果取消引用指针str,则会获得该位置的字节,该字节恰好是字符串的第一个字符。如果你*(str + 1)你得到第二个,这与写str[1]完全相同。

答案 3 :(得分:1)

cout << str << endl;打印“你好吗”,因为strchar *,被视为字符串。

cout << i << endl;打印0xbfac1eb0,因为iint [],被视为int*,被视为void*,这是一个指针

cout << *str << endl' prints "h"因为*strchar,其值为'h'。