package main
import (
"fmt"
)
type Numbers struct {
x int
y int
}
func initial(number *Numbers) {
number.x = 1
number.y = 1
}
func final(number *Numbers) {
number = &Numbers{2, 2}
}
func main() {
p := Numbers{0, 0}
fmt.Println(p) //Prints {0 0}
initial(&p)
fmt.Println(p) //Prints {1 1}
final(&p)
fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}
为什么 initial
函数修改指针,而 final
函数修改指针的副本?
initial
和final
的函数参数都指向p
在main
中的内存地址; initial
能够更改 p
,而 final
则不能。
任何解释为什么会出现这种情况,我们将不胜感激。
正确答案
要修改指针指向的数据,必须取消引用该指针。解引用运算符是 *
。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1
被转换为 (*number).x = 1
。
这种隐式翻译可能会令人困惑,但您应该看到,如果翻译没有发生,那么表达式 number.x = 1
将毫无意义,因为 number
是指针类型,并且指针没有字段。
综上所述,initial
函数具有隐式指针解引用,而 final
则没有。
如果您将 final
更改为显式且正确地取消引用,*number = Numbers{2, 2}
,那么它也会更改 p
。
以上就是如何确定作为函数参数传递的指针是否正在被修改,或者副本是否正在被修改?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755