把字符串赋给一个指针变量,即是把字符串的首地址赋给该指针变量。
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编辑过]
----------------解决方案--------------------------------------------------------
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编辑过]
----------------解决方案--------------------------------------------------------