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

为何无法正确更新指针指向的变量?C语言指针操作疑问

问题解析:为什么第二段指针操作无法更新外部变量?

这是C语言里非常常见的指针参数使用误区,我来给你把问题拆解得明明白白:

核心原因:C语言的参数传递是「值传递」

不管你传的是普通变量还是指针,函数拿到的都是实参的副本。当你调用max30205MeasureTemperature(&registerTemp);时,函数内部的tmpTwoComplement只是&registerTemp的一个复制品——它是一个独立的指针变量,只是初始指向和实参一样,指向registerTemp的内存地址。

两段代码的本质区别

能正常工作的代码

*tmpTwoComplement = rawTemp.swrd;

这里的*tmpTwoComplement是解引用操作:它会顺着指针的指向,找到registerTemp所在的内存地址,然后把rawTemp.swrd的值直接写入到这块内存里。这样外部的registerTemp自然就被更新了,因为你实实在在修改了它对应的内存内容。

失效的代码

tmpTwoComplement = &rawTemp.swrd;

这里你只是修改了函数内部的指针副本的指向,让它从指向registerTemp改成指向rawTemp.swrd。但这个修改完全不会影响到外部的实参&registerTemp——函数执行结束后,这个局部的指针副本就被销毁了,外部的registerTemp从头到尾都没被触碰过,当然不会有任何变化。

额外补充:如果非要修改指针指向怎么办?

如果你的需求是让外部的指针变量指向新的地址(不过在这个场景下完全没必要,第一种方法更直接合理),那你需要传递指针的指针(也就是int16_t **类型的参数),然后在函数里解引用指针的指针来修改外部指针的指向。不过回到你的场景,第一种直接解引用赋值的写法才是正确且高效的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:37:57