为何无法正确更新指针指向的变量?C语言指针操作疑问
问题解析:为什么第二段指针操作无法更新外部变量?
这是C语言里非常常见的指针参数使用误区,我来给你把问题拆解得明明白白:
核心原因:C语言的参数传递是「值传递」
不管你传的是普通变量还是指针,函数拿到的都是实参的副本。当你调用max30205MeasureTemperature(®isterTemp);时,函数内部的tmpTwoComplement只是®isterTemp的一个复制品——它是一个独立的指针变量,只是初始指向和实参一样,指向registerTemp的内存地址。
两段代码的本质区别
能正常工作的代码
*tmpTwoComplement = rawTemp.swrd;
这里的*tmpTwoComplement是解引用操作:它会顺着指针的指向,找到registerTemp所在的内存地址,然后把rawTemp.swrd的值直接写入到这块内存里。这样外部的registerTemp自然就被更新了,因为你实实在在修改了它对应的内存内容。
失效的代码
tmpTwoComplement = &rawTemp.swrd;
这里你只是修改了函数内部的指针副本的指向,让它从指向registerTemp改成指向rawTemp.swrd。但这个修改完全不会影响到外部的实参®isterTemp——函数执行结束后,这个局部的指针副本就被销毁了,外部的registerTemp从头到尾都没被触碰过,当然不会有任何变化。
额外补充:如果非要修改指针指向怎么办?
如果你的需求是让外部的指针变量指向新的地址(不过在这个场景下完全没必要,第一种方法更直接合理),那你需要传递指针的指针(也就是int16_t **类型的参数),然后在函数里解引用指针的指针来修改外部指针的指向。不过回到你的场景,第一种直接解引用赋值的写法才是正确且高效的选择。
内容的提问来源于stack exchange,提问作者ndarkness
相关产品推荐
相关产品推荐

