当我学习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`循环。请参考`正确代码`示例。