为了账号安全,请及时绑定邮箱和手机立即绑定

为什么更改指针副本不会影响初始对象

为什么更改指针副本不会影响初始对象

Go
哔哔one 2022-06-06 17:46:00
我学会了处理指针,在这个例子中我不明白为什么将 i3 重新分配给一个新的当前对象并执行 current = current.next 操作不会影响 i3 对象。但是,使用相同的地址func main() {        i := &Node{data: 1}        i2 := &Node{data: 2, next: i}        i3 := &Node{data: 3, next: i2}        current := i3        for current.next != nil {                current = current.next        }        log.Println(current)        log.Println(i3)        /*        2020/06/03 12:19:23 &{1 <nil>}        2020/06/03 12:19:23 &{3 0xc42000e1f0}        */}type Node struct {        data int         next *Node} 而如果我不使用 i3 对象的副本,则该对象在循环中被很好地修改func main() {        i := &Node{data: 1}        i2 := &Node{data: 2, next: i}        i3 := &Node{data: 3, next: i2}        log.Println(i3)        /*                2020/06/03 12:22:05 &{3 0xc42000e1f0}        */        for i3.next != nil {                i3 = i3.next        }        log.Println(i3)        /*                2020/06/03 12:22:05 &{1 <nil>}        */}
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

current两者i3都是指针。


current:= i3

复制指针意味着现在current将指向指向的相同地址i3。


指针的副本与它的复制没有任何关系,只是两者都指向相同的值。所以修改current对i3.


你可以用这种方式做到这一点


current := &i3

for (*current).next != nil {

    *current = (*current).next

}

现在current是一个指针i3,现在如果改变当前指向的值会影响i3。


查看完整回答
反对 回复 2022-06-06
?
茅侃侃

TA贡献1842条经验 获得超22个赞

在您的第一个示例中,短变量声明:

current := i3

创建一个名为current指针类型的新变量。它是一个不同于 的变量i3,但它具有相同的指针值。

循环仅修改(分配给)current变量,因此存储在其中的指针i3永远不会改变。所以在循环之后i3仍然指向带有 的节点data = 3,并且current将是最后一个,即带有data = 1

在第二个示例中,您没有创建current变量,而是修改(分配给)i3变量。所以在循环之后它将指向最后一个节点data = 1。在这两种情况下,节点对象都不会被修改,只是currentori3变量。


查看完整回答
反对 回复 2022-06-06
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

在第一个示例中,您创建了一个指针,该指针current将具有与所具有的值相同的值i3(结构的地址Node{data: 3, next: i2})。


当你在 for 循环中执行current = current.next语句时,你只改变了指针的值,而不是地址后面的值。您只需替换指针中存储的地址。


如果您遵循迭代:


0., current -> Node{data: 3, next: i2}     

1., current -> Node{data: 2, next: i}     

2., current -> Node{data: 1}  

其他指针将保持不变。


i -> Node{data: 1}      

i2 -> Node{data: 2, next: i}     

i3 -> Node{data: 3, next: i2}   

在第二种情况下,您执行相同的操作,但是current现在您更改了存储在指针中的地址,而不是i3指针。如果您遵循迭代:


0., i3 -> Node{data: 3, next: i2}     

1., i3 -> Node{data: 2, next: i}     

2., i3 -> Node{data: 1}     

其他指针将保持不变。


i -> Node{data: 1}      

i2 -> Node{data: 2, next: i}  

当然,您将在内存中的某处有一个对象而无法访问它(Node {data:3,next:i2})


查看完整回答
反对 回复 2022-06-06
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号