| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1187 人关注过本帖
标题:[求助]字符串指针
只看楼主 加入收藏
boyatec
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-7-28
收藏
得分:0 
以下是引用沉路在2006-7-27 11:28:26的发言:

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

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; 输出的不是地址呢?


cout<<p<<endl=printf("%s",p),
cout<<*p<<endl=printf("%c",*p)

这样能理解吗?

2006-07-28 11:15
X4one
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-7-27
收藏
得分:0 

我好像记得谭的《C》中说过

* 是取地址运算
% 是取地址的内容运算

具体哪页忘了


我们今天所恨的,往往是明天所爱的...
2006-07-28 16:48
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 

谢谢!我总结如下:

1,如何输出字符指针的地址?(未解决)
根据3楼和6楼的提示,做如下实验:(运行于vc6.0)
int *p="hello";
printf("%d\n",p);//输出:4349984
printf("%p\n",p);//输出:00426020
这两个都不是地址,因为地址是十六进制表示的,我猜这两个数没有意义。那么,到底如何才能输出字符指针p的地址呢?

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);
11楼是正确的。

[此贴子已经被作者于2006-7-30 19:13:15编辑过]


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-07-30 19:09
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 
请指正。并讨论一下第一个问题!

我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-07-30 19:12
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
引用
int *p="hello";
printf("%d\n",p);//输出:4349984
printf("%p\n",p);//输出:00426020
这两个都不是地址,因为地址是十六进制表示的,我猜这两个数没有意义。那么,到底如何才能输出字符指针p的地址呢?

上面就是地址,(00426020)H=(4349984)D

[此贴子已经被作者于2006-7-30 20:06:09编辑过]


对不礼貌的女生收钱......
2006-07-30 19:29
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
以下是引用soft_wind在2006-7-30 19:29:32的发言:

printf("%p\n",p);//输出:00426020


这不是地址这是什么呢?

这不是16进制这是什么呢

你用printf("%x",p); 试试


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-30 20:02
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

被人误会了。
那是楼主的总结,我搬过来的


对不礼貌的女生收钱......
2006-07-30 20:05
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
..下回引用..弄的我搞不清楚了

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-30 20:06
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 
呵呵,十六进制不是以0x开头的么?
还有,c语言的书上没有讲到 %x,%p之类的东西,可以给点这方面的资料么?

我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-07-30 22:25
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 
经过实验:
char *s="hello";
printf("%d\n",s);//输出十进制地址
printf("%p\n",s);//输出十六进制地址,以00开头

char c='a',*pc=&c;
printf("%d\n",pc);//输出十进制地址
printf("%p\n",pc);//输出十六进制地址,以00开头
cout<<pc<<endl;// 输出乱码——为什么?

int a,*pa=&a;
printf("%d\n",pa);//输出十进制地址
printf("%p\n",pa);//输出十六进制地址,以00开头
cout<<pa<<endl;//输出十六进制地址,以0x开头

[此贴子已经被作者于2006-7-30 23:05:39编辑过]


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-07-30 23:00
快速回复:[求助]字符串指针
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018096 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved