Go的指针
指针
指针是一种存储变量内存地址(Memory Address)的变量。
1 取一个变量的地址:& 取地址符号
2 在非指针类型前面加*,表示指向这个类型的指针
3 在指针变量前加*,表示解引用(反解),取该指针指向的值
一、指针的声明
var a = 10
// 取地址,生成指针
var pointer = &a
fmt.Println(pointer) // 0xc00000a0c8
// 指针类型为 *+普通类型
fmt.Printf("%T",pointer) // *int
二、指针的默认值(Zero Value)
是 nil。
因为指针也是引用类型。
var b *int
fmt.Println(b)
// <nil>
三、指针的解引用
在指针变量前加*,表示解引用(反解),取该指针指向的值。
var a = 10
var pointer = &a
// 解引用
fmt.Println(*pointer) // 10
四、向函数传递指针参数
1、非 数组/切片 指针传参
var b =156
fmt.Println(b) // 156
f1(&b) // 100
fmt.Println(b) // 100
func f1(x *int) {
*x=100
fmt.Println(*x) // 100
}
2、数组/切片 指针传参
不推荐向函数传递数组的指针,而应该使用切片。
因为切片的长度是不固定的,可以随意变化其引用的数组的长度;而如果是数组的指针,那长度就是固定的,无法变换类型了。
var c =[3]int{1,2,3}
fmt.Println(c) // [1 2 3]
f3(c[:])
fmt.Println(c) // [100 2 3]
func f3(x []int) {
x[0]=100
fmt.Println(x) // [100 2 3]
}
// 不过硬要传数组的指针也可以
var c =[3]int{1,2,3}
fmt.Println(c) // [1 2 3]
f2(&c)
fmt.Println(c) // [100 2 3]
func f2(x *[3]int) {
x[0]=100 //支持指针直接操作,自动反解,自动解引用
//(*x)[1] = 222 //正统写法
fmt.Println(*x) // [100 2 3]
fmt.Println(x) // &[100 2 3] //指向数组的指针,就这样
}
五、Go不支持指针运算
Go 并不支持其他语言(例如 C)中的指针运算。
b := [...]int{109, 110, 111}
p := &b
p++
上面的程序会抛出编译错误:main.go:6: invalid operation: p++ (non-numeric type \*[3]int)
。