Go数组: 数组做函数参数 和 指向数组的指针做参数

数组和函数
即 数组作为函数的参数

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是指针数组,即数组中各元素都为指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值