2.10 Go 指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。一个指针变量可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。

在指针类型前面加上 号(前缀)来获取指针所指向的内容,这里的 号是一个类型更改器。

变量是一种使用方便的占位符,用于引用计算机内存地址。 Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

示例:

  1. var i1 int = 10
  2. fmt.Printf("An integer: %d, its location in memory: %p\n", i1, &i1)
  3. var intP *int //intP 的类型是[int型的指针]
  4. intP = &i1 //intP 的值为 [i1的地址]
  5. fmt.Printf("The value at memory location %p is %d\n", intP, *intP)

输出:

An integer: 10, its location in memory: 0xc0420080a8 The value at memory location 0xc0420080a8 is 10

程序在内存中存储它的值,每个内存块(或字)有一个地址,通常用十六进制数表示,如:0x6b08200xc0420080a8

符号 可以放在一个指针前,如 `intP`,那么它将得到这个指针指向地址上所存储的值;这被称为反引用(或者内容或者间接引用)操作符;另一种说法是指针转移。

对于任何一个变量 var, 如下表达式都是正确的:var == *(&var)

  1. package main
  2. import "fmt"
  3. func main() {
  4. var i1 int = 10
  5. fmt.Printf("An integer: %d, its location in memory: %p\n", i1, &i1)
  6. var intP *int //intP 的类型是[int型的指针]
  7. intP = &i1 //intP 的值为 [i1的地址]
  8. fmt.Printf("The value at memory location %p is %d\n", intP, *intP)
  9. *intP = 2 // *intP 的值为 [[i1的地址]的指针] (其实就是i1嘛),这行代码也就等价于 i1 = 2
  10. fmt.Printf("i1=%d;intP=%p;*intP=%d\n", i1, intP, *intP)
  11. }

Go 空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。

nil 指针也称为空指针。

  1. package main
  2. import "fmt"
  3. func main() {
  4. var p *int
  5. fmt.Println(p)
  6. }

输出:

小结:

不能进行指针运算

指针传递是很廉价的,只占用 4 个或 8 个字节(在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节)。当程序在工作中需要占用大量的内存,或很多变量,或者两者都有,使用指针会减少内存占用和提高效率。

links