注册 登录
编程论坛 C++教室

请教字符串指针问题

sunlong 发布于 2008-11-26 09:37, 1566 次点击
如下小程序:
#include <iostream>
using namespace std;
int main()
{
    char *pc="HELLO";
    cout<<pc<<endl;
    cout<<*pc<<endl;

    return 0;
}
为什么cout<<pc<<endl;得到的结果是 HELLO 。若有高手知晓,请详细解释下。谢谢
8 回复
#2
pascale2008-11-26 11:06
lz是不是认为应该输出地址?
如果输出地址的话需要作类型转换(unsigned *)pc
#3
pascale2008-11-26 11:10
01 #include <iostream>
02 using namespace std;
03 int main()
04 {
05         char *pc="HELLO";
06         cout<<pc<<endl;
07         cout<<*pc<<endl;
08         cout<<(unsigned *)pc<<endl;
09
10         pc=pc+3;
11         cout<<pc<<endl;
12         cout<<*pc<<endl;
13         cout<<(unsigned *)pc<<endl;
14
15         return 0;
16 }
[/font]


最后的输出结果是:
pascale@pascale-laptop:~/tech/dev/c++/p5-str$ ./a.out
HELLO
H
0x8048980
LO
L
0x8048983

[[it] 本帖最后由 pascale 于 2008-11-26 11:11 编辑 [/it]]
#4
pascale2008-11-26 11:13
pc输出的是整个字符串
*pc输出的是字符串的首字母
(unsigned *)pc输出的是字符串的地址
#5
sunlong2008-11-26 11:58
多谢楼上,其实我是想知道,cout<<pc<<endl;能输出字符串的内部机理!
#6
sunkaidong2008-11-26 12:11
你看看<<的运算符操作吧...我没看过,估计是到'\0'结束
#7
pascale2008-11-26 14:21
可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。

[例8.12]

void main(void)

{char *string="I Love China!";

printf("%s\n",string);

}

在这里没有定义字符数组,但C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串数组。在程序中定义了一个字符指针变量string。并把字符串首地址(即存放字符串的字符数组的首地址)赋给它(见图8.18)。有人认为string是一个字符串变量,以为定义时把"I Love China!"赋给该字符串变量,这是不确切的。定义string的部分:

char *string="I Love China!";

等价于下面两行:

char *string;

string="I Love China!";

可以看到:string被定义为一个指针变量,它指向字符型数据,请注意只能指向一个字符变量或其它字符类型数据,不能同时指向多个字符数据,更不是把"I Love China!"这些字符存放到string中。只是把"I Love China!"的首地址赋给指针变量string(不是把字符串赋给*string)。因此不要认为上述定义行等价于:


char *string;

*string="I Love China!";

在输出时,用

printf("%s\n",string);

%s表示输出一个字符串,给出字符指针变量名string,则系统先输出它所指向的一个字符数据,然后自动使string加1,使之指向下一个字符,然后再输出一个字符,……,如此直到遇到字符串结束标志‘\0’为止。注意,在内存中,字符串的最后被自动加了一个‘\0’(如图8.18所示),因此在输出时能确定字符串的终止位置。
#8
pascale2008-11-26 14:21
上面是转载过来的对应的C的资料
cout类似
#9
sunlong2008-11-26 15:28
则系统先输出它所指向的一个字符数据,然后自动使string加1,使之指向下一个字符,然后再输出一个字符,……,如此直到遇到字符串结束标志‘\0’为止.
多谢楼上。
字符指针对于<<来说,全作为字符串的首地址来处理,它会不断输出这个地址及其后面地址里存放的内容,只到遇到'\0'。看来和其他类型的内部实现机理略有不同啊
1