C语言中格式说明符与指针搭配输出异常的疑问
指针与printf格式说明符的疑问
先看第一个代码示例:
char *s = "Hi"; printf("%s",s);
此处s是指针,使用格式说明符"%s"时,输出为字符串"Hi"。
再看第二个代码示例:
int a = 1; int *p = &a; printf("%i", p);
此处p同样是指针,使用格式说明符"%i"时,为何输出不是整数"1"?
若两者都使用格式说明符"%p",都会输出变量的地址。但为何使用变量对应类型的格式说明符时,无法都输出变量存储的内容?
核心逻辑差异:格式说明符对指针的处理规则不同
%s是专为字符串指针定制的格式符:它接收char*类型的指针后,会自动从该指针指向的内存地址开始,逐个读取字符,直到碰到字符串结束符'\0'才停止,所以能直接输出整个字符串内容。%i是用来输出整数数值的格式符:它的预期参数是int类型的值,但你传入的是int*指针(本质是一段内存地址的数值),所以它会直接把指针本身存储的地址值当作整数输出,不会去访问指针指向的内存空间里的内容。
正确输出int指针指向内容的方法
要让p输出指向的整数1,你需要手动解引用指针,获取它指向的内存中的实际值,再传给printf:
int a = 1; int *p = &a; printf("%i", *p); // 此时输出1
为什么%s不需要手动解引用?
这是C语言标准对printf格式符的约定:%s的设计逻辑就是自动完成“解引用+连续读取字符”的操作,相当于内部封装了解引用和循环读取的逻辑;而%i、%f这类基础类型的格式符,都要求你传入对应类型的实际值,所以必须手动解引用指针才能拿到指向的内容。
内容的提问来源于stack exchange,提问作者Anya
相关产品推荐
相关产品推荐

