chat *p="hello" printf("%s",p) 为什么能输出hello?

p不是代表的字符串的首地址止吗?那么输出的时候也得这样写吧printf("%s",*p)... p不是代表的字符串的首地址止吗?那么输出的时候也得这样写吧printf("%s",*p) 展开
 我来答
匿名用户
2020-01-16
展开全部
当参数是%s时,程序会去对应的值的地址上把内容打印出来直到遇到'\0'
所以到P这个地址上依次打印h,e,l,l,o(当然没有逗号)
如果printf("%s",*p)也是可以编通过,但是*p=h,h的值是0x68(ASCII码),所以程序会去0x68这个地址上找数据打印,当然极大可能是访问非法内存,要不然就是打印这个地址上的数据,反正不是你要的结果
路之舞者
2020-01-17 · TA获得超过430个赞
知道小有建树答主
回答量:1454
采纳率:78%
帮助的人:214万
展开全部
懂汇编最好看下汇编输出,理解下这段代码编译器是如何进行处理的。
p是指针,指针代表它里边存的不是普通数据而是代表一个地址(在该地址处存放数据的具体内存位置,而p本身也是有自己的值),而我们本来的意思也是想把该地址开始的数据按次序输出直到结束,%s参数是输出字符串,我们需要给出字符串地址,所以用p参数而不是*p
说了一堆不知道你好不好理解,告诉你个秘诀和需要留意的地方:
1. 通过简短语句的汇编输出来观察c编译器对变量分配、各种类型传参、函数调用等的处理(翻译) 从本质上把握住,拨开迷雾得见真相。
2.观察不同函数对指针或者指针参数的处理是否不同,什么意思呢? 拿你这个例子来说,printf需要传递p就代表了正确,那么其他函数是否也是这样理解的呢,还是说别的函数是需要*p来代表地址,c在这方面处理是否保持统一自己观察。
3. 对于第一点补充,结合自己画内存图来帮助再配合汇编输出理解,重点对printf 传参的p的处理,其实汇编上是分解多步实现的,这一点一定要加深理解加注意,这是学好c的关键。
有人说汇编简单,更接近机器看的更清楚,这话有道理。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式