博客网 >

字符串指针
作者:分类:默认分类标签:

把字符串赋给一个指针变量,即是把字符串的首地址赋给该指针变量。

char *p="hello";

那么当我们输出p时,是不是输出地址呢?不是。请看下面四种情况:

printf("%s\n",p);//输出结果是hello

printf("%s\n",*p);

//运行出错。“0x00401a8c”指令引用的“0x00000043”内存。该内存不能为“read”.

cout<<p<<endl;//结果是hello

cout<<*p<<endl;//结果是h

既然p保存的是地址,为什么cout<<p; 输出的不是地址呢?

__________________________________________

把问题发到论坛上,引来各路高手的讨论。总结如下:

1,如何输出字符指针的地址?
根据3楼和6楼的提示,做如下实验:(运行于vc6.0)
int *p="hello";
printf("%d\n",p);//输出:4349984,十进制地址
printf("%p\n",p);//输出:00426020,十六进制地址
(00426020)H=(4349984)D


2,%s的输出规则:
%s是输出字符串,具体是从当前地址开始输入一个字符,然后把地址加1,再输出下一个字符,直到遇到‘\0’。因此,%s具有输出一串字符的功能,%d等则没有。

3,printf("%s",*p);的理解是完全错误的!应该是:
printf("%c",*p);//*p是取p的内容,p是首字符的地址,因此*p是首字符。如果用
                        // %d,则输出首字符的ASCII码。
那么我们对比一下这两句:
printf("%s",p);//输出字符串内容
printf("%c",*p);//输出字符内容
如果说p是地址,那么*p是内容天经地义,但第一句p也成了内容,这只能解释为%s的特殊规则。

4,cout的自动匹配:
cout<<p<<endl;//等价于printf("%s",p);
cout<<*p<<endl;//等价于printf("%c",*p);

<< 指针简介 / C/C++中的转义字符 >>

专题推荐

不平凡的水果世界

不平凡的水果世界

平凡的水果世界,平凡中的不平凡。 今朝看水果是水果 ,看水果还是水果 ,看水果已不是水果。这境界,谁人可比?在不平凡的水果世界里,仁者见仁,智者见智。

中国春节的那些习俗

中国春节的那些习俗

正月是农历新年的开始,人们往往将它看作是新的一年年运好坏的兆示期。所以,过年的时候“禁忌”特别多。当然,各个地方的风俗习惯不一样,过年的禁忌也是不一样的。

评论
0/200
表情 验证码:

沉路

  • 文章总数0
  • 画报总数0
  • 画报点击数0
  • 文章点击数0
个人排行
        博文分类
        日期归档