You need to enable JavaScript to run this app. C语言中能否将字符串赋值给char指针?printf输出字符串用法疑问
优惠活动
大模型
产品
解决方案
定价
更多

C语言中能否将字符串赋值给char指针?printf输出字符串用法疑问

问题1:给char类型指针直接赋值字符串字面量为什么合法?

C语言中双引号包裹的字符串字面量(如"Hello stackoverflow")会被编译器预处理为存储在只读数据段的连续字符数组,数组末尾会自动追加\0作为字符串结束标记。
在赋值表达式中,数组名会自动退化为指向其首元素的指针,因此p = "Hello stackoverflow"的本质是将该字符数组首元素(即字符H)的内存地址赋值给指针p,完全符合「指针仅存储内存地址」的规则,指针本身并没有存储整个字符串内容,只是持有了字符串的起始地址。


问题2:printf输出字符串时为什么直接传p而不是*p?

这是C标准库对printf的%s格式符的约定:%s要求传入的参数是C风格字符串的首字符地址,函数内部会从该地址开始逐个读取字符输出,直到遇到\0结束符才会停止。
如果传入*p,本质是对指针解引用得到首地址存储的单个字符H,类型为char。此时printf会把字符H对应的ASCII码值当作内存地址去读取内容,属于非法内存访问,会触发未定义行为,轻则程序崩溃,重则输出乱码。
如果要单独输出首字符,使用%c格式符时才需要解引用,例如printf("%c", *p)会正确输出字符H。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:36:05