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

puts函数、指针与字符串工作原理及strchr()相关疑问咨询

关于puts、指针、字符串及strchr的工作原理解答

先直接给你梳理清楚所有疑问,结合你的示例代码一步步拆解:

1. 字符串与指针的关系(你的理解是对的!)

在C语言里,字符串字面量比如"MEAS:VOLT:DC?"本质是一块以\0(空字符)结尾的字符数组,它会被存在程序的只读内存区域里。

当你写char *t = "MEAS:VOLT:DC?";时,t是一个char*类型的指针,它的作用就是指向这个字符数组的第一个字符(也就是'M'所在的内存地址)。之后p = t;执行后,p和t确实指向同一个内存地址——也就是字符串的起始位置,二者都是指向这个字符串的指针,只是变量名不同而已。

2. puts(p)为什么输出字符串而不是地址?

puts()函数的参数是const char*类型,它的工作逻辑是:从指针指向的内存地址开始,逐个输出字符,直到遇到\0结束符为止。所以puts(p)不会输出地址,而是输出从p指向的位置开始的整个字符串。

比如你的代码里第一次调用puts(p),p指向'M',所以会输出完整的MEAS:VOLT:DC?。

3. strchr()的工作原理,以及为什么能获取目标字符之后的内容

strchr(const char *s, int c)的作用是:在字符串s中查找第一个等于c的字符,找到后返回指向该字符的指针;如果找不到,就返回NULL。

你的循环逻辑是:

while(( p = strchr( p, ':' )) != NULL ) {
    puts( ++p );
}

这里的执行流程是:

  • 第一次循环:strchr(p, ':')从当前p(指向'M')开始找':',找到后返回指向第一个':'的指针,把这个指针赋值给p。然后++p是把指针往后移动一位,指向':'后面的第一个字符(也就是'V'),puts(++p)就从'V'开始输出到\0,结果是VOLT:DC?。
  • 第二次循环:此时p指向'V',strchr(p, ':')从这里开始找下一个':',找到VOLT后面的':',返回指向它的指针给p。++p指向'D',puts输出DC?。
  • 第三次循环:p指向'D',strchr从这里找':',找不到,返回NULL,循环结束。

你对++p的理解完全正确——它确实会让指针指向':'之后的下一个字符,这也是为什么每次puts能输出目标字符后面的内容。

补个关键细节

要注意:字符串字面量是只读的,所以你不能通过t或者p去修改字符串里的字符(比如t[0] = 'X'是未定义行为),如果需要修改的话,应该把字符串复制到可写的字符数组里,比如char t[] = "MEAS:VOLT:DC?";。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:34:35