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

代码
char *s="abcd";
printf("%s",s);
为什么不用*s呢?
然而代码
char *p;
int a=5;
p=&a;
printf("%d",*p);
为什么就有*呢??这个地方困惑半个月了,求详解啊!越详细越好,本人新手!!

字符串和字符或者变量是有所不同的
%s是输出一个字符串,以字符串结束符当输出的结束判断
s是指向一个5byte空间,其中有4个字符和一个结束符
打印%s是需要一个地址的,所以s不需要加*

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

这么说明白了?

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

需要地址还是需要内容,这个看需要追问

那么凡是有字符串的时候,如果需要打印字符串就必须用%s格式呗?这个能解释一下吗?是不是指针指向字符串的时候,地址即是字符串?而内容就是具体的字符?这是规定呗?

追答

看看printf的解释吧
其实跟着规定走即可
字符串打印到屏幕有两个
printf的%s和puts。他是对内存空间中一块数据打印到屏幕上
他们都是对字符串的首地址(数组的中间也可以,只要是个内存的地址即可)进行操作,以字符串的结束符为结束标志(不管是不是超过你申请的数组的长度)

地址不是字符串,只是表示一块内存数据的开始位置,是一个内存空间的位置即可

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-20
printf("%s",s);用s的原因是,%s要求输入一个指针,或数组名(也类似于指针);
如果换成要打印一个字符:printf("%c",*s);这里就需要输入指针指向的字符而不是指针了;
指针的表示用s,指针指向的字符用*s或s[0]。
同理,printf("%d",*p);这是要输出p指向的整型数据;printf("%d",p);则是要输出指针本身的值(也就是a的地址)了。追问

太感谢了 非常感谢 谢谢你

第2个回答  推荐于2017-11-26
char *s="abcd";
printf("%s",s); // 对于"%s",函数要求字符串变量指针,所以用s。

char *p;
int a = 5;
p = &a;
printf("%d",*p); // 对于"%d",函数要求一个int型变量,*p是解除指针,取得int型值。

本回答被提问者采纳
相似回答