内存地址是内存中每个字节单元的唯一编号,而指针则是一个实体。指针会分配内存空间,相当于一个专门用来保存地址的整形变量。
- 取值运算符
&
用于获取对象地址 - 指针运算符
*
用于间接引用目标对象 - 二级指针
**T
,如包含包名则写成*package.T
1.指针运算符为左值时,我们可以更新目标对象的状态;而为右值时则是为了获取目标的状态。
func main() {
x := 10
var p *int = &x //获取地址,保存到指针变量
*p += 20 //用指针间接引用,并跟新对象
println(p, *p) //输出指针所存储的地址,以及目标对象
}
输出:
0xc000040780 30
2.指针类型支持相等运算符,但不能做加减运算和类型转换。如果两个指针指向同一地址,或都为nil,那么它们相等。
func main() {
x := 10
p := &x
p++ //编译报错 invalid operation: p++ (non-numeric type *int)
var p2 *int = p+1 //invalid operation: p + 1 (mismatched types *int and int)
p2 = &x
println(p == p2) //指向同一地址
}
可通过unsafe.Pointer将指针转换为uintptr后进行加减法运算,但可能会造成非法访问。