Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。以下实例演示了变量在内存中地址:
func main() {
var a int = 10
fmt.Printf("变量的地址 = %x",&a)
}
解释:
var var_name *var-type
/*
var-type 为指针类型,var_name 为指针变量名,
* 号用于指定变量是作为一个指针。以下是有效的指针声明:
*/
1.go空指针
/*当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
func main() {
var ptr *int
fmt.Printf("ptr的值为:%x",ptr)
}
if (ptr != nil) {
//不是空指针
}else{
//空指针
}
2.指针数组
const Max int = 3
func main() {
a := []int{10,100,200}
for i := 0; i < Max; i++ {
fmt.Printf("a[%d] = %d",i,a[i])
}
}
//输出结果
a[0] = 10
a[1] = 100
a[2] = 200
//声明了整形指针数组
var ptr [Max]*int
//ptr为整型指针数组。因此每个元素都指向了一个值。 一下实例将三个整数存储在指针数组中
const Max int = 3
func main() {
a :=[]int{10,200,300}
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",i,*ptr[i])
}
}
//输出结果
a[0] = 10
a[1] = 200
a[2] = 300
3.go语言指向指针的指针
//如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量
var ptr **int
func main() {
var a int
var ptr *int
var pptr *int
a = 3000
//指针ptr的地址
ptr = &a
//指向指针ptr的地址
pptr = &ptr
//获取pptr的值
fmt.Printf("变量a = %d",a)
fmt.Printf("指针变量 *ptr = %d",*ptr)
fmt.Printf("指向指针的指针变量 **pptr = %d", **pptr)
}
//输出
/*
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
*/
4.go语言指针作为函数参数
//Go 语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可。
func main() {
//定义局部变量
var a int = 100
var b int = 200
fmt.Printf("交换前的a的值 %d 交换前的b的值 %d",a,b)
//调用函数用于交换值
/*
&a指向 a变量的地址
&b指向 b变量的地址
*/
swap(&a ,&b)
fmt.Printf("交换后a的值 %d 交换后b的值 %d",a,b)
}
func swap(x *int , y *int) {
var temp int
temp = *x //保存x地址的值
*x = *y //将y赋值给x
*y = temp //将temp 赋值给y
}