【golang数组转链表】请问谁能指点下,这种嵌套struct的赋值原理呢

weixin_38050362 2019-09-20 10:01:30
`以下代码是将数组转换成链表,但是我不明白为什么循环里面对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的`
...全文
130 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38052215 2019-09-20
  • 打赏
  • 举报
回复
你好 我打印了 temp只是一个中间变量 出循环后只保留循环的最后一次值 我纠结的是为什么对temp的修改影响了res
weixin_38058131 2019-09-20
  • 打赏
  • 举报
回复
本帖代码是可以直接运行的 http://play.flysnow.org/
weixin_38068894 2019-09-20
  • 打赏
  • 举报
回复
首先,对temp的修改并没有影响到res 其次。对temp指向的目标的修改影响到了res指向的目标,因为它们指向了同一个目标。 你这里本质上有三个变量,temp,res 和*res
weixin_38071069 2019-09-20
  • 打赏
  • 举报
回复
好 谢谢你的提示哈~ 但是temp指向的目标不应该与res指向的独立开了吗 是因为加了*ListNode这个缘故吗 还是因为虽然temp复制了res 但是他们都指向ListNode的指针是吗 其实最终返回的是*ListNode
weixin_38077297 2019-09-20
  • 打赏
  • 举报
回复
是我的理解不对 temp、res一直是对ListNode的引用 而不是复制 修改任意一个都会影响ListNode的值
weixin_38090274 2019-09-20
  • 打赏
  • 举报
回复
temp 和 res 都是指针,他们指向的地址是一样的。 但是指针本身在内存中的地址不一样。
weixin_38096967 2019-09-20
  • 打赏
  • 举报
回复
res := &ListNode{ Val: elements[0], } res实际得到的是一个指针。 temp := res,当然temp实际也是一个指针。 golang太多简化的语法,但简化的负作用就是坑更多。 不懂C语言的,从java转GO,碰到这种问题,必定一头雾水。 懂C语言,学GO很容易。
weixin_38100924 2019-09-20
  • 打赏
  • 举报
回复
嗯 这里很让人挺疑惑
weixin_38103285 2019-09-20
  • 打赏
  • 举报
回复
题主可以看一下C语言指针的内容。
weixin_38051062 2019-09-20
  • 打赏
  • 举报
回复
指针和值地址的奇淫技巧还是不太适应
weixin_38052002 2019-09-20
  • 打赏
  • 举报
回复
你需要打印 *temp和*res

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧