Go 语言笔记:指针
指针
指针,指向的是一个变量或者常量的内存地址
指针声明及使用
指针通过在指定类型前面加 * 符号来定义指针,如下的 age 指针
指针如果只做了声明,没有任何变量为其赋值,那么该指针视为 空指针,其值为
<nil>
,如下面的 ptr
go
package main
import "fmt"
func main() {
var a = 20
var age *int
var ptr *float32
age = &a // 使用 & 符号获得变量 a 的内存地址,并赋值给指针 age
fmt.Println(age) // a 的 内存地址 0xc000018090
fmt.Println(ptr) // <nil>
*age = 30 // 使用 * 符号来改变指针的对应的内存地址中的值为 30
fmt.Println(a) // a 的值变更为 30
fmt.Println(age) // a 的 内存地址依然为 0xc000018090,没有变更
}
二级指针
Go 语言支持定义一个指向指针的指针,也就是二级指针,如下:
go
package main
import "fmt"
func main() {
a := 1
fmt.Println(a) // 1
var b = &a // 一级指针,指向变量 a 的地址
fmt.Println(&a) // 内存地址 0xc000018090
fmt.Println(b) // 内存地址 0xc000018090
var c = &b // 二级指针,指向指针 b 的地址
fmt.Println(&b) // 内存地址 0xc00000e030
fmt.Println(c) // 内存地址 0xc00000e030
}
指针的作用
通过指针改变指针指向的内存地址中的值,比如交换两个变量的值,就可以用过指针来改变内存地址的值来操作
go
package main
func main() {
a := 1
b := 2
swap(&a, &b)
println(a, b)
}
func swap(c *int, d *int) {
var temp = *c // 将 c 指针对应的内存地址中的值赋值给临时变量 temp
*c = *d // 将 d 指针对应的内存地址的值赋值给指针 c 内存地址中的值
*d = temp // 将临时变量 temp 的值赋值给指针 d 对应的内存地址中的值
}