Go(3)指针

149 阅读2分钟

指针

一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我们可以直接读或更新对应变量的值,而不需要知道该变量的名字(如果变量有名字的话)。

如果用“var x int”声明语句声明一个x变量,那么&x表达式(取x变量的内存地址)将产生一个 指向该整数变量的指针,指针对应的数据类型是 *int ,指针被称之为“指向int类型的指针”。 如果指针名字为p,那么可以说“p指针指向变量x”,或者说“p指针保存了x变量的内存地址”。 同时 *p 表达式对应p指针指向的变量的值。一般 *p 表达式读取指针指向的变量的值,这里 为int类型的值,同时因为 *p 对应一个变量,所以该表达式也可以出现在赋值语句的左边,表 示更新指针所指向的变量的值。

x := 1
p := &x // p, of type *int, points to x
fmt.Println(*p) // "1"
*p = 2 // equivalent to x = 2
fmt.Println(x) // "2"

指针之间也是可以进行相等测试的,只有当它们指向同一个变量或全部是nil时才相等。

在Go语言中,返回函数中局部变量的地址也是安全的。例如下面的代码,调用f函数时创建局部变量v,在局部变量地址被返回之后依然有效,因为指针p依然引用这个变量。

var p = f()
func f() *int {
v := 1
return &v
}

每次我们对一个变量取地址,或者复制指针,我们都是为原变量创建了新的别名。例如, *p 就是是 变量v的别名。指针特别有价值的地方在于我们可以不用名字而访问一个变量。