我学会处理指针,
在这个例子中,我不明白为什么
将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>}
*/
}
最佳答案
current
和i3
都是指针。
current:= i3
复制一个指针意味着现在
current
将指向i3
指向的相同地址。指针的副本与被复制的指针没有任何关系,只是两者都指向相同的值。因此,修改
current
对i3
没有任何影响。你可以用这种方式
current := &i3
for (*current).next != nil {
*current = (*current).next
}
现在
current
是i3
的指针,现在如果您更改将影响i3
的当前指针值。
关于pointers - 为什么更改指针的副本不会影响初始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62170556/