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前边不需要加*号就可以输出(加了*反而不能输出)。 展开
{
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前边不需要加*号就可以输出(加了*反而不能输出)。 展开
1个回答
展开全部
这就是规则,格式符%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'
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,结束了字符串
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询