标题:关于字符串指针问题 求大神不吝赐教!
只看楼主
zla1215
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2015-4-26
 问题点数:0 回复次数:4 
关于字符串指针问题 求大神不吝赐教!
声明指针
main()
{char *pa;pa=“my world”;//问题1:为什么pa可以这么声明,“my world”地址是哪里来的?
 printf (“%s”,pa); /*问题2:为什么输出pa不用他的解引用*pa形式?pa变变量不是存储“my world”的首地址么?为什么printf语句能输出my world。

exit 0;
搜索更多相关主题的帖子: 字符串 world 
2015-04-28 03:28
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
原本这些规则已经固化了,就像1+1=2,从没想过是怎么来的,让你一问就有点迷糊了,看来我基本功不扎实。
你的第一个问题:我认为字符串地址是编译器编译时安排的。就我理解,c字符串赋值有3种方式,一种是给char数组,这时字符串地址会是该数组的首地址(数组的首地址也是编译时安排的);二是给char型指针,这时编译器会默认字符串为一常量,会在常量区自动开辟一个空间存储字符串,并将该字符串首地址给指针,无法通过该指针修改这个值;三是无主字符串,你可以直接("abcd";),结果你会发现编译器直接跳过了这句,因为这是无意义的,不需分配空间。
你的第二个问题:其实你可以printf (“%s”,*pa); 编译可以通过,只是显示的结果未知,printf是否把参数值当作地址用还是直接显示值取决于第一个参数的格式,%s就会把它对应位置的值作为首地址使用,显示该地址指向的字符,直到碰到'\0'停止显示。
我是这样认为的,不知道是否正确。

能编个毛线衣吗?
2015-04-28 07:14
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
回复 2楼 wmf2014
推荐《编译器与加载器》看看

总有那身价贱的人给作业贴回复完整的代码
2015-04-28 08:00
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
回复 2楼 wmf2014
printf (“%s”,pa)
printf也是函数,“%s”和pa是它的入参,所以,“%s”也是常量字符串,也存储在常量区,在这句调用中,第一个入参实际上是“%s”的地址。
所以所有用“”括起来的字符串都是常量字符串,都存储在常量区。

总有那身价贱的人给作业贴回复完整的代码
2015-04-28 08:05
zla1215
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2015-4-26
得分:0 
回复 2楼 wmf2014
感谢版主的细心回答!
你那贪吃蛇帖子我看了,我只能说太屌了,我什么时候能达到你的高度啊^_^

看c也看了个把月了,刚才那个指针问题我想了好几天也没想通。看来还是要把全书学完内容都结合起来才能一窥c的面貌了,^_^
2015-04-28 13:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-444588-1-1.html




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

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