在线文档  >   Golang练习   >   指针

Go支持指针,允许在程序中通过引用来传递值和数据结构。
在 Go 语言中,使用 * 可以表示一个变量是指针类型。指针是一个存储变量内存地址的变量。我们可以通过取地址运算符 & 来获取一个变量的地址,然后将其赋值给一个指针类型的变量。

例如:

var a int = 10
var ptr *int    // 定义一个指向 int 类型数据的指针变量
ptr = &a        // 将变量 a 的地址赋值给指针变量 ptr

fmt.Printf("a 的值为 %d\n", a)         // 输出 a 的值为 10
fmt.Printf("ptr 指向的值为 %d\n", *ptr) // 输出 ptr 指向的值为 10

上面的代码中,ptr 是一个指向 int 类型数据的指针变量,&a 表示获取变量 a 的地址,然后将其赋值给指针变量 ptr。通过 *ptr 即可访问 a 的值。

我们将使用两个函数zeroval和zeroptr,来对比 指针 和 值。

package main

import "fmt"

// zeroval有一个整型参数,因此参数将按值传递给它。 
// zeroval将获得一个与调用函数中不同的ival副本。
func zeroval(ival int) {
    ival = 0
}

// 相反,zeroptr具有*int参数,这意味着它采用int指针。
// 函数体中的 *iptr,将从它的内存地址到该地址的当前值 取消引用 指针。
// 取消引用的指针赋值将会更改引用地址的值。
func zeroptr(iptr *int) {
    *iptr = 0
}

func main() {
    i := 1
    fmt.Println("initial:", i)

    zeroval(i)
    fmt.Println("zeroval:", i)

    //通过`&i`语法获取`i`的内存地址,即`i`的指针。
    zeroptr(&i)
    fmt.Println("zeroptr:", i)

    // 也可以打印指针
    fmt.Println("pointer:", &i)
}

运行结果如下:

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

zeroval不会改变main中的i 的值,但是zeroptr可以,是因为它引用了该变量的内存地址。