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

C语言入门疑问:char*定义的str是指针还是数组?相关代码运行原理求解

C语言char*字符串与字符数组原理解答

1. 类型明确:char *str是指针变量,不是数组

C语言的类型声明规则非常明确:只要变量名前带*修饰,就是指针类型。这里的str本质上只占用指针大小的内存空间(32位系统占4字节,64位系统占8字节),存储的是内存地址,而非字符串本身。

2. printf("%s", str)输出完整字符串的原理

%s格式符的设计逻辑就是接收char类型的起始内存地址,执行时会从这个地址开始,逐字节读取内存中的字符,直到遇到字符串结束标记\0才停止输出。
你写的char *str = "Information";实际执行了两个操作:

  • 编译阶段,编译器会在程序的只读常量区生成完整的字符串序列:I n f o r m a t i o n \0,末尾自动补\0作为结束符
  • 运行阶段,把这个字符串第一个字符'I'的内存地址赋值给指针变量str
    所以把str传给%s时,就是把字符串首地址传入,自然会从'I'开始读到\0,输出完整的Information。

3. str+6输出ation的原理

指针的加法是「类型长度对齐偏移」:char类型占1字节,所以str+6就是在str存储的首地址基础上向后偏移6个字节,刚好指向字符串中下标为6的字符'a'(字符串下标从0开始计数:0=I、1=n、2=f、3=o、4=r、5=m、6=a)。
把偏移后的地址传给%s,就会从'a'开始向后读取到\0,因此输出ation。
额外说明你代码中后两个printf的等价性:C语言中*(指针+偏移量)和指针[偏移量]是完全等价的写法,数组下标访问的本质就是指针偏移后解引用,因此*(str+6)和str[6]都能拿到偏移6位后的单个字符'a',用%c输出就是单个字符a。

4. 两种写法的差异

你写的字符数组版本也是合法可用的,和char*版本的核心区别在于存储区域和可修改性:

  • char str[15] = "Information";是在程序栈空间开辟了15字节的数组内存,把只读常量区的字符串完整拷贝到了栈上的数组中。你可以随意修改数组内的字符,比如str[0] = 'i'是合法操作
  • char *str = "Information";的str指向的是只读常量区的字符串,常量区内容禁止修改,如果尝试执行str[0] = 'i'会直接触发段错误导致程序崩溃
    如果你的代码仅需要读取字符串内容,两种写法都能正常运行;如果需要修改字符串内容,只能用字符数组的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:39:02