Skip to content

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 对应的内存地址中的值
}

Released under the MIT License.