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

C语言printf打印字符串为何无需使用解引用运算符*?

问题解析:printf("%s", one)为何无需解引用运算符

示例代码

#include<stdio.h>
char*display();

int main() {

    char*one=NULL;

    one=display();

    one[3]='9';

    printf("%s",one);//疑问(为何不使用解引用运算符)
}


char*display(){

    static char a[30]="hello";   

    return a; 
}

核心原因

这是由printf中%s格式符的参数规则直接决定的:

  • %s的作用是打印字符串,它要求传入的参数必须是指向字符串首字符的char*类型指针。变量one本身就是指向静态数组a首字符的指针,完全符合%s的参数要求,所以直接传入即可。
  • 要是用*one,得到的是指针指向的第一个字符(这里是'h'),此时printf会把这个字符的ASCII值当作内存地址来解析,这属于未定义行为,大概率会导致程序崩溃或输出乱码。
  • 额外补充:C语言里数组名在多数场景下会自动转换成指向首元素的指针,display函数返回的a就是这种转换后的结果,所以one拿到的是字符串首字符的地址,printf会从这个地址开始遍历内存,直到遇到字符串结束符\0才停止打印。

内容的提问来源于stack exchange,提问作者Bharath R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:55:29