【Golang 计划】04 Go 基础四-指针

140 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

指针

定义

一个指针变量指向一个值的内存地址。

在 Go 语言中,函数传参都是值拷贝,如果改变某个变量,可以通过创建一个指向该变量地址的指针变量。传递数据使用指针,就无需拷贝数据。注意,Go 语言中类型指针是不能进行偏移和运算。

指针操作:

  • 取地址:&
  • 根据地址取值:*

指针地址和指针类型

每个变量在内存中都有一个地址的,代表变量所在的位置,通过使用 & 可以对变量进行取地址操作

ptr := &val  

val 是被取地址的变量,类型为 T。ptr 是接收地址的变量,类型为 *T ,称为T的指针类型。 * 代表指针。

var a *int. // a 是类型为int的指针
ptr := &a  // ptr的类型是int指针类型的地址,值是 a 的指针地址

这就是,每个变量都有地址,指针的值就是地址。

指针取值

挡在值类型前面加*表示是指针。那么当对一个定义为普通类型的使用&操作符取地址会怎么样?

func main() {
    //指针取值
    a := 10
    b := &a // 取变量a的地址,将指针保存到b中
    fmt.Printf("type of b:%T\n", b)
    c := *b // 指针取值(根据指针去内存取值)
    fmt.Printf("type of c:%T\n", c)
    fmt.Printf("value of c:%v\n", c)
}
​
// 输入结果
type of b:*int
type of c:int
value of c:10

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。所以,如果对变量取地址&操作,得到这个变量的指针变量,指针变量的值就将会是指针地址,对指针变量取值*操作,可以得到指针变量指向原变量的值。

空指针

如果定义了指针,但是未分配任何值,那它的值将为 nil

 var p *string
 if p != nil {
        fmt.Println("非空")
 } else {
        fmt.Println("空值")
 }

\