指针字符串输出时候前面没有* 为什么

代码char*s="abcd";printf("%s",s);为什么不用*s呢?然而代码char*p;inta=5;p=&a;printf("%d",*p);为什么就有*... 代码
char *s="abcd";
printf("%s",s);
为什么不用*s呢?
然而代码
char *p;
int a=5;
p=&a;
printf("%d",*p);
为什么就有*呢??这个地方困惑半个月了,求详解啊!越详细越好,本人新手!!
展开
 我来答
cpucash
2014-02-20 · TA获得超过1584个赞
知道小有建树答主
回答量:1457
采纳率:66%
帮助的人:970万
展开全部
字符串和字符或者变量是有所不同的
%s是输出一个字符串,以字符串结束符当输出的结束判断
s是指向一个5byte空间,其中有4个字符和一个结束符
打印%s是需要一个地址的,所以s不需要加*

%d打印是需要一个变量,而不是一个地址,所以下面的需要加*来表示一个变量,而不是地址
p是地址,不是你所需要的
你下面的那个*可以不加,但是打印的是p中所存储的内容,而不是p指向的地址中的内容
也就是说不加*打印出来的是p的内容,是一个地址,也就是a的地址
加*,打印的是p指向的内存空间的内容,也就是a地址中的数据,p中存储的内容是a的地址

这么说明白了?

一个变量有两个数据,你知道吧
一个是变量的内容,也就是变量地址中存储的数据
一个是变量的地址,这个是分配的内存空间的流水地址

需要地址还是需要内容,这个看需要
追问
那么凡是有字符串的时候,如果需要打印字符串就必须用%s格式呗?这个能解释一下吗?是不是指针指向字符串的时候,地址即是字符串?而内容就是具体的字符?这是规定呗?
追答
看看printf的解释吧
其实跟着规定走即可
字符串打印到屏幕有两个
printf的%s和puts。他是对内存空间中一块数据打印到屏幕上
他们都是对字符串的首地址(数组的中间也可以,只要是个内存的地址即可)进行操作,以字符串的结束符为结束标志(不管是不是超过你申请的数组的长度)

地址不是字符串,只是表示一块内存数据的开始位置,是一个内存空间的位置即可
cdyzxy
2014-02-20 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3749万
展开全部
printf("%s",s);用s的原因是,%s要求输入一个指针,或数组名(也类似于指针);
如果换成要打印一个字符:printf("%c",*s);这里就需要输入指针指向的字符而不是指针了;
指针的表示用s,指针指向的字符用*s或s[0]。
同理,printf("%d",*p);这是要输出p指向的整型数据;printf("%d",p);则是要输出指针本身的值(也就是a的地址)了。
追问
太感谢了 非常感谢 谢谢你
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
推荐于2017-11-26 · TA获得超过8610个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3485万
展开全部
char *s="abcd";
printf("%s",s); // 对于"%s",函数要求字符串变量指针,所以用s。

char *p;
int a = 5;
p = &a;
printf("%d",*p); // 对于"%d",函数要求一个int型变量,*p是解除指针,取得int型值。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式