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)

posted @ 2020-03-29 21:47  Donner  阅读(187)  评论(0编辑  收藏  举报