当前位置: 代码迷 >> C语言 >> [求助]字符串指针
  详细解决方案

[求助]字符串指针

热度:100   发布时间:2006-07-28 11:15:17.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)

这样能理解吗?


----------------解决方案--------------------------------------------------------

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

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

具体哪页忘了


----------------解决方案--------------------------------------------------------

谢谢!我总结如下:

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编辑过]


----------------解决方案--------------------------------------------------------
请指正。并讨论一下第一个问题!
----------------解决方案--------------------------------------------------------
引用
int *p="hello";
printf("%d\n",p);//输出:4349984
printf("%p\n",p);//输出:00426020
这两个都不是地址,因为地址是十六进制表示的,我猜这两个数没有意义。那么,到底如何才能输出字符指针p的地址呢?

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

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


----------------解决方案--------------------------------------------------------
以下是引用soft_wind在2006-7-30 19:29:32的发言:

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


这不是地址这是什么呢?

这不是16进制这是什么呢

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


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
..下回引用..弄的我搞不清楚了
----------------解决方案--------------------------------------------------------
呵呵,十六进制不是以0x开头的么?
还有,c语言的书上没有讲到 %x,%p之类的东西,可以给点这方面的资料么?
----------------解决方案--------------------------------------------------------
经过实验:
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编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案