数组和函数
即 数组作为函数的参数
func test(x [2]int) {//数组作为参数
fmt.Printf("x:%p,%v\n", &x, x)
}
func main() {
a := [2]int{1, 2}
var b [2]int
b = a// 把a完全赋给b,实现数组的copy
fmt.Printf("a:%p,%v\n", &a, a)
fmt.Printf("b:%p,%v\n", &b, b)
test(a)
}
a:0xc00000c1e0,[1 2]
b:0xc00000c1f0,[1 2]
x:0xc00000c240,[1 2]
可以看出,x的地址并不等于a的地址,经过函数test,二者传递的时值而不是地址。因为数组名不代表数组的首地址,所以赋值和传参都会复制全部的元素,形参的变化不会改变实参
数组,指针和函数
func test(x *[2]int) {//指向数组的指针作为参数
x[1]+=10
fmt.Printf("x:%p,%v\n", x, *x)
}
func main() {
a := [2]int{1, 2}
test(&a)
fmt.Printf("a:%p,%v\n", &a, a)
}
a:0xc00000c1e0,[1 ,12]
x:0xc00000c1e0,[1 ,12]
由此可见,当指向数组的指针作为函数的参数时,形参的变化能够改变数组
与数组做参数相比较
func test(x [2]int) { //数组作为参数
x[1] += 10
fmt.Printf("x:%p,%v\n", &x, x)
}
func main() {
a := [2]int{1, 2}
fmt.Printf("a:%p,%v\n", &a, a)
test(a)
fmt.Printf("a:%p,%v\n", &a, a)
}
a:0xc0000a0090,[1 2]
x:0xc0000a00e0,[1 12]
b:0xc0000a0090,[1 2]
可以明显地看出差别
需要注意的是
var x *[2] int //x是指向数组的指针,即指向数组的首地址
var y[2] *int//y是指针数组,即数组中各元素都为指针