You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:25:02