Go 语言指针数组
在我们了解指针数组前,先看个实例,定义了长度为 3 的整型数组:
实例
package main
import "fmt"
const MAX int = 3
func main() {
a := []int{10,100,200}
var i int
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i, a[i] )
}
}
import "fmt"
const MAX int = 3
func main() {
a := []int{10,100,200}
var i int
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i, a[i] )
}
}
以上代码执行输出结果为:
a[0] = 10 a[1] = 100 a[2] = 200
有一种情况,我们可能需要保存数组,这样我们就需要使用到指针。
以下声明了整型指针数组:
var ptr [MAX]*int;
ptr 为整型指针数组。因此每个元素都指向了一个值。以下实例的三个整数将存储在指针数组中:
实例
package main
import "fmt"
const MAX int = 3
func main() {
a := []int{10,100,200}
var i int
var ptr [MAX]*int;
for i = 0; i < MAX; i++ {
ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
}
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i,*ptr[i] )
}
}
import "fmt"
const MAX int = 3
func main() {
a := []int{10,100,200}
var i int
var ptr [MAX]*int;
for i = 0; i < MAX; i++ {
ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
}
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i,*ptr[i] )
}
}
以上代码执行输出结果为:
a[0] = 10 a[1] = 100 a[2] = 200
青云刀歌
185***40132@163.com
参考地址
创建指针数组的时候,不适合用 range 循环。
错误代码:
输出结果为:
从结果中我们发现内存地址都一样,而且值也一样。怎么回事?
这个问题是range循环的实现逻辑引起的。跟for循环不一样的地方在于range循环中的x变量是临时变量。range循环只是将值拷贝到x变量中。因此内存地址都是一样的。
正确代码如下:
输出结果为:
从结果中可以看出内存地址都不一样。
青云刀歌
185***40132@163.com
参考地址
flying81621
fly***81621@163.com
关于楼上的创建指针数组的时候,说的不适合用 range 循环。
其实不是不能用 range 循环,只是楼主不会用而已。
这是楼主的原始代码:
这样是使用 range 的正确用法,两个地方改动:range &number 改成 range number,ptrs[i] = &x 改成 ptrs[i]=&number[i]:
flying81621
fly***81621@163.com
wayne
xuw***5@163.com
flying81621 的方法与青云刀歌的方法并无区别,flying81621 的 for range 方法也只是用于遍历数组,并没用使用 range 方法的临时变量。真正赋值的地方只有一次,for 的 body 内 ,青云刀歌真正原因在于,x临时变量仅被声明一次,此后都是将迭代 number 出的值赋值给 x , x 变量的内存地址始终未变,这样再将 x 的地址发送给 ptrs 数组,自然也是相同的。
原代码:
输出结果:
正确使用应增加一个临时变量
输出结果
wayne
xuw***5@163.com
THY
toh***foryou@outlook.com
楼上的代码只是把临时变量 temp 的地址赋给了指针数组。
可以发现两组地址是不同的:
清云刀歌 的是没有问题的,还可以直接用一个数组指针。
输出结果:
THY
toh***foryou@outlook.com