指针的定义
指针是另一个与变量相关且必须掌握的要素。在 Go 语言中声明变量时, 将在计算机内存 中给它分配一个位置,以便能够存储、 修改和获取变量的值。
&与*符号含义
&:打印出地址值而非变量值
*:通过指针访问对象目标
例一
//使用&获取地址值
func main() {
s := "helloworld"
fmt.Println(&s)
}
输出结果为16进制地址值 0xc000090020
例二
//使用*获取指针访问对象目标
func main() {
s := "helloworld"
var p = &s
fmt.Println(*p)
//这里先将变量s的地址值赋值给p,使用*打印出p的实际值
例三
s := "helloworld"
var p = &s
fmt.Println(s)
fmt.Println(*p)
fmt.Println(&s)
fmt.Println(p)
//可以发现&s与p是一致的,这里p = &s,是把s的内存空间值赋值给了p,但是单独打印&p的值仍然是不一致的
//可以发现s与*p是一致的,这里的*p成为解引用或间接引用,在这里就是间接引用的s的值
//简单的来说就是*p通过&s赋值,使用了s的内存空间进而间接使用了s空间中存储的值
}
例四
s := "hello"
var p *string = &s
fmt.Println(*p)
s = "hello world"
fmt.Println(*p)
s = "hello world go"
fmt.Println(*p)
}
#结果
hello
hello world
hello world go
//这里证明了,当p使用s的地址时,相当于使用s的变量地址来操作s
例子四-操作利用*指针修改值
func main() {
x, y := 1, 2
swap(&x, &y)
fmt.Println(x, y)
}
func swap(a, b *int) {
t := *a
*a = *b
*b = t
}
空指针-nil
func main() {
var s *string
fmt.Println(s)
if s == nil {
fmt.Println("Sorry, no data")
}
}
#输出结果nil,与在其他语言中null none 一个意义
向函数传递指针参数
func main() {
s := 10
modify(s)
fmt.Println(s)
modify1(&s)
fmt.Println(s)
}
func modify(x int) {
x = 100 //这里未修改为100
}
func modify1(x *int) {
*x = 100 //这里成功修改成100
}