golang 用range 创建指针数组

一下内容摘自:https://www.runoob.com/go/go-array-of-pointers.html

  1. 创建指针数组的时候,不适合用 range 循环。

  2. 错误代码:

    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变量中。因此内存地址都是一样的。

    正确代码如下:

    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

    从结果中可以看出内存地址都不一样。

  3. 关于楼上的创建指针数组的时候,说的不适合用 range 循环。

    其实不是不能用 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)
        }
    }

    这样是使用 range 的正确用法,两个地方改动:range &number 改成 range numberptrs[i] = &x 改成 ptrs[i]=&number[i]

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

猜你喜欢

转载自blog.csdn.net/lengyue1084/article/details/106395350