golang初探之range循环引起的指针数组不正确的问题

更多精彩内容C语言指针朱森 彻底搞定C语言指针——初学者的救赎金巴多Lua 5.1 参考手册苏黎九歌面试题cosWriter要去服兵役的TOP鸡涌你系我滴阳光 · · 2887 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

当我学习go的指针数组的时候。下面这段代码可以创建正确的指针数组。

正确代码

const max = 3

func main() {
    number := [max]int{5, 6, 7}
    var ptrs [max]*int //指针数组
    //将number数组的值的地址赋给ptrs
    for i := 0; i < max; i++ {
        ptrs[i] = &number[i]
    }
    for i, x := range ptrs {
        fmt.Printf("指针数组:索引:%d 值:%d 值的内存地址:%d\n", i,*x, x)
    }
}

打印内容。可以看到内存地址都不一样。这是没问题的。

指针数组:索引:0 值:5 值的内存地址:824634212672
指针数组:索引:1 值:6 值的内存地址:824634212680
指针数组:索引:2 值:7 值的内存地址:824634212688

当我将for循环改变为range循环之后,确发现内存地址都一样。而且值也一样。怎么回事?

错误代码

const max = 3

func main() {
    number := [max]int{5, 6, 7}
    var ptrs [max]*int //指针数组
    //将number数组的值的地址赋给ptrs
    for i, x := range &number {
        ptrs[i] = &x
    }
    for i, x := range ptrs {
        fmt.Printf("指针数组:索引:%d 值:%d 值的内存地址:%d\n", i, *x, x)
    }
}
指针数组:索引:0 值:7 值的内存地址:824634204304
指针数组:索引:1 值:7 值的内存地址:824634204304
指针数组:索引:2 值:7 值的内存地址:824634204304

这个问题是range循环的实现逻辑引起的。跟for循环不一样的地方在于range循环中的x变量是临时变量。range循环只是将值拷贝到x变量中。因此内存地址都是一样的。

结论

 创建指针数组的时候,不适合用`range`循环。请参考`正确代码`示例。

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:更多精彩内容C语言指针朱森 彻底搞定C语言指针——初学者的救赎金巴多Lua 5.1 参考手册苏黎九歌面试题cosWriter要去服兵役的TOP鸡涌你系我滴阳光

查看原文:golang初探之range循环引起的指针数组不正确的问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2887 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传