`以下代码是将数组转换成链表,但是我不明白为什么循环里面对temp这个中间变量的赋值会影响到res,我打印发现二者的地址是不同的,所以不存在引用啊,但实际结果是temp的赋值对res产生了影响,得到了正确的链表即res`
```
package main
import (
"fmt"
)
// 链表基本结构
type ListNode struct {
Val int
Next *ListNode
}
// 数组转链表
func makeListNode(elements []int) *ListNode {
if len(elements) == 0 {
return nil
}
res := &ListNode{
Val: elements[0],
}
// temp对res复制,二者没有关系了
temp := res
for i := 1; i < len(elements); i++ {
// 对temp的子属性赋值
temp.Next = &ListNode{Val: elements[i]}
// 再将temp指向当前子属性 作为下一轮循环的当前值
temp = temp.Next
}
fmt.Println(temp) // &{5 <nil>}
fmt.Println(res) // &{2 0xc0000a0030}
fmt.Println(&temp) // 0xc000090018
fmt.Println(&res) // 0xc000090010
return res
}
func main() {
a := []int{2, 4, 5}
// 调用
b := makeListNode(a)
// 但实际结果是temp的赋值对res产生了影响,得到了正确的链表
fmt.Println(b) // &{2 0xc000094040}
}
```
`请问是否有工具可以看到这整个赋值的过程呢?temp的修改是如何影响到res的`
首先,对temp的修改并没有影响到res
其次。对temp指向的目标的修改影响到了res指向的目标,因为它们指向了同一个目标。
你这里本质上有三个变量,temp,res 和*res
#5