2.10 Go 指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。一个指针变量可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。
在指针类型前面加上 号(前缀)来获取指针所指向的内容,这里的 号是一个类型更改器。
变量是一种使用方便的占位符,用于引用计算机内存地址。 Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
示例:
var i1 int = 10
fmt.Printf("An integer: %d, its location in memory: %p\n", i1, &i1)
var intP *int //intP 的类型是[int型的指针]
intP = &i1 //intP 的值为 [i1的地址]
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
程序在内存中存储它的值,每个内存块(或字)有一个地址,通常用十六进制数表示,如:0x6b0820
或0xc0420080a8
。
符号 可以放在一个指针前,如 `intP`,那么它将得到这个指针指向地址上所存储的值;这被称为反引用(或者内容或者间接引用)操作符;另一种说法是指针转移。
对于任何一个变量 var, 如下表达式都是正确的:var == *(&var)
。
package main
import "fmt"
func main() {
var i1 int = 10
fmt.Printf("An integer: %d, its location in memory: %p\n", i1, &i1)
var intP *int //intP 的类型是[int型的指针]
intP = &i1 //intP 的值为 [i1的地址]
fmt.Printf("The value at memory location %p is %d\n", intP, *intP)
*intP = 2 // *intP 的值为 [[i1的地址]的指针] (其实就是i1嘛),这行代码也就等价于 i1 = 2
fmt.Printf("i1=%d;intP=%p;*intP=%d\n", i1, intP, *intP)
}
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
package main
import "fmt"
func main() {
var p *int
fmt.Println(p)
}
输出:
小结:
不能进行指针运算
指针传递是很廉价的,只占用 4 个或 8 个字节(在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节)。当程序在工作中需要占用大量的内存,或很多变量,或者两者都有,使用指针会减少内存占用和提高效率。
links
- 目录
- 上一节:Go 双向链表
- 下一节:new和make的区别