在线文档 > 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
可以,是因为它引用了该变量的内存地址。