嗨,大家好
我对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
答案 0 :(得分:6)
如果您要打印地址,则必须将char*
转换为void*
,
const char *str = "how are you\n";
cout << (void*) str << endl;
由于演员阵容缺席,cout
将str
视为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;
打印“你好吗”,因为str
是char *
,被视为字符串。
cout << i << endl;
打印0xbfac1eb0,因为i
是int []
,被视为int*
,被视为void*
,这是一个指针
cout << *str << endl' prints "h"
因为*str
是char
,其值为'h'。