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

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

        */


}


哔哔one
浏览 147回答 3
3回答

隔江千里

current两者i3都是指针。current:= i3复制指针意味着现在current将指向指向的相同地址i3。指针的副本与它的复制没有任何关系,只是两者都指向相同的值。所以修改current对i3.你可以用这种方式做到这一点current := &i3for (*current).next != nil {&nbsp; &nbsp; *current = (*current).next}现在current是一个指针i3,现在如果改变当前指向的值会影响i3。

茅侃侃

在您的第一个示例中,短变量声明:current&nbsp;:=&nbsp;i3创建一个名为current指针类型的新变量。它是一个不同于 的变量i3,但它具有相同的指针值。循环仅修改(分配给)current变量,因此存储在其中的指针i3永远不会改变。所以在循环之后i3仍然指向带有 的节点data = 3,并且current将是最后一个,即带有data = 1。在第二个示例中,您没有创建current变量,而是修改(分配给)i3变量。所以在循环之后它将指向最后一个节点data = 1。在这两种情况下,节点对象都不会被修改,只是currentori3变量。

慕尼黑5688855

在第一个示例中,您创建了一个指针,该指针current将具有与所具有的值相同的值i3(结构的地址Node{data: 3, next: i2})。当你在 for 循环中执行current = current.next语句时,你只改变了指针的值,而不是地址后面的值。您只需替换指针中存储的地址。如果您遵循迭代:0., current -> Node{data: 3, next: i2}&nbsp; &nbsp; &nbsp;1., current -> Node{data: 2, next: i}&nbsp; &nbsp; &nbsp;2., current -> Node{data: 1}&nbsp;&nbsp;其他指针将保持不变。i -> Node{data: 1}&nbsp; &nbsp; &nbsp;&nbsp;i2 -> Node{data: 2, next: i}&nbsp; &nbsp; &nbsp;i3 -> Node{data: 3, next: i2}&nbsp; &nbsp;在第二种情况下,您执行相同的操作,但是current现在您更改了存储在指针中的地址,而不是i3指针。如果您遵循迭代:0., i3 -> Node{data: 3, next: i2}&nbsp; &nbsp; &nbsp;1., i3 -> Node{data: 2, next: i}&nbsp; &nbsp; &nbsp;2., i3 -> Node{data: 1}&nbsp; &nbsp; &nbsp;其他指针将保持不变。i -> Node{data: 1}&nbsp; &nbsp; &nbsp;&nbsp;i2 -> Node{data: 2, next: i}&nbsp;&nbsp;当然,您将在内存中的某处有一个对象而无法访问它(Node {data:3,next:i2})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go