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

标签 pointers go

我学会处理指针,
在这个例子中,我不明白为什么
将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>}
        */

}

最佳答案

currenti3都是指针。

current:= i3

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

指针的副本与被复制的指针没有任何关系,只是两者都指向相同的值。因此,修改currenti3没有任何影响。

你可以用这种方式
current := &i3
for (*current).next != nil {
    *current = (*current).next
}

现在currenti3的指针,现在如果您更改将影响i3的当前指针值。

关于pointers - 为什么更改指针的副本不会影响初始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62170556/

相关文章:

c - 将 void 指针转换为 char 指针是否安全

macos - 无法在 OSX 上使用 docker 公开 Web 服务器

go - 如何模拟 stripe 需要 webhooks 的捕获事件?

go - 有没有办法在不停机的情况下更新 net/http 服务器中的 TLS 证书?

java - Golang enum 可以像 Java 的 enum 一样做同样的行为吗?

c++ - 将函数指针返回到在 main() 中初始化的对象

使用 fork 创建子项并出现段错误(核心转储)

C++ unique_ptr 和数组

c - C语言中如何返回一个指向字符串的指针

string - golang 将 "type []string"转换为字符串