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

C语言中指针赋值值而非地址的行为及char*指针使用相关疑问

C语言char*字符串指针问题解答

问题1:ptr指向什么内容?

你的猜测是对的,ptr存储的是字符串字面量"Hello"首字符'H'的内存地址。要额外注意的是,C中的字符串字面量默认存储在进程的只读数据段,尝试修改ptr指向的内容会触发未定义行为。

问题2:为什么ptr的表现和普通指针不一致?

ptr本身就是普通的char*类型指针,不存在特殊逻辑,你感知到的“不一致”本质是对C字符串存储规则、printf格式化符要求不熟悉导致的误解。

问题3:printf("%s", *ptr)报错、printf("%s", ptr)正常的原因

printf的%s格式化符明确要求传入指向字符串首字符的char*类型指针,它的内部逻辑是从传入的地址开始,逐字节读取字符直到遇到终止符'\0'为止:

  • 写*ptr时,你实际传入的是ptr指向的首字符的值,也就是'H'对应的ASCII码0x48,printf会把这个整型值当成内存地址去读取,而0x48属于进程的非法访问地址,自然会触发段错误/未定义行为。
  • 写ptr时,传入的就是字符串首字符的合法地址,完全符合%s的参数要求,所以可以正常输出完整的Hello字符串。

问题4:ptr中实际存储的内容是什么?

ptr是指针类型变量,里面存储的就是一个整型的虚拟内存地址值,对应的是字符串字面量"Hello"第一个字符'H'在进程地址空间中的位置。


内容的提问来源于stack exchange,提问作者Mr. CLOWN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:45:06