C语言指针输出数据问题

voidmain(){int*p1=NULL;char*p2=NULL;char*p3=NULL;chara[]={"HIKARI"};charb={'A'};intc=... void main()
{
int* p1 = NULL;
char* p2 = NULL;
char* p3 = NULL;
char a[] = { "HIKARI" };
char b = { 'A' };
int c = 1;
p1 = a;
p2 = &b;
p3 = &c;
printf("a=%s,b=%c,c=%d", p1,*p2,*p3);
}
百度的大佬们,以上程序输出结果为a=HIKARI,b=A,c=1。请问为什么唯独输出a变量的时候,指针p1前边不需要加*号就可以输出(加了*反而不能输出)。
展开
 我来答
庄政警
2019-07-22 · TA获得超过9916个赞
知道大有可为答主
回答量:1113
采纳率:94%
帮助的人:869万
展开全部
这就是规则,格式符%s的含义就是:把对应的值看做一个地址,按字节读取,然后输出读取到的值所对应的ASCII码,直到碰到0为止
p1是个地址,假设p1的值是1000(也就是数组a的起始地址),那么从1000开始依次读取到HIKARI\0 然后输出
如果是*p1 那么*p1是'H','H'的ASCII值是72, 那么printf("%s",*p1); 就是从地址72开始读取,也就是printf("%s",72); 而地址72是不允许用户程序操作的,会出错。
再举个例子:
int a = 4407873;
printf("%s", &a);
会输出ABC 因为变量a内存空间的值按字节看就是'A','B','C','\0'
更多追问追答
追问
dalao,例子那我有点没看懂,4407873(10)=43 4241‬(16)吗?为啥不是输出CBA?
追答
就是16进制的43 42 41
在intel的x86硬件体系下,整数在内存中的存放规则是以字节为单位低位在前高位在后的方式,所以0x434241这个整数在32位的int环境下4个字节从低到高是:0x41 0x42 0x43 0x00

以%S输出就是ABC, 最后的第四个字节的0x00充当了\0,结束了字符串
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式