在程序运行时,变量存储在内存中,每个变量都对应一个内存地址,通过内存地址可以获得内存地址上存储的数据。可以认为,指针就是内存地址。Go语言中指针不能进行运算,相对比较简单。

在本文中,将全程使用完整的变量定义语法。

Go的指针操作与其他大多数语言一样,使用两个符号进行操作

&:取地址
*:取值

取地址

对一个变量取地址,并打印其内存地址

func main() {
    var a int = 10
    fmt.Printf("%p", &a) // 0xc00000eb40
}

使用“&”符号,得到变量a的内存地址0xc00000eb40。

取值

对指针变量取值,或者说是获取内存地址上的数据

func main() {
    var a int = 10
    var b *int = nil // 定义一个指针变量b
    b = &a           // 将变量a的地址给指针变量b
    fmt.Println(*b)  // 10
}

使用“*”符号,对指针变量b取值,值为10。

操作指针

明白了取地址、取值操作后,现在来进一步看看如何操作数据

  • 1

    func main() {
      var a int = 10
      var b *int = nil
      b = &a         // 指针变量b指向变量a的内存地址
      *b = 20        // 将内存地址上的数据赋值为20
      fmt.Println(a) // 20
    }

    以上例程中,变量a被修改为20。

  • 2

    func modify(n *int) {
      *n = 30 // 将内存地址上的数据赋值为30
    }
    
    func main() {
      var a int = 10
      modify(&a)     // 传入变量a的内存地址
      fmt.Println(a) // 30
    }

    以上例程中,变量a被修改为30。需要注意的是,函数modify形参n类型为指针类型,所以在调用时需要传入内存地址,在函数modify内部操作内存地址上的数据。会PHP的朋友可能很熟悉,这里的操作类似于PHP中的引用,但PHP中不存在指针这个概念。

标签: Go, 指针

添加新评论