指针的基本使用
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
Go语言中使用对于指针存在两种操作: 取址
和取值
。(Go语言中的指针只有两个操作权限)
符号 | 名称 | 作用 |
---|---|---|
&变量 | 取址符 | 返回变量所在的地址 |
*指针变量 | 取值符 | 返回指针指地址存储的值 |
package main
import "fmt"
func main() {
// &变量:获取变量地址
var x = 10
fmt.Printf("重新赋值之前x的对应地址: %p\n", &x)
x = 100
fmt.Printf("重新赋值之后x的对应地址: %p\n", &x)
}
/*
赋值之前x的对应地址: 0xc000122008
赋值之后x的对应地址: 0xc000122008
*/
指针变量用来接收地址的值。指针类型存储地址值
var p *int // p 是一个整型指针类型
p = &x
fmt.Println(p)
取地址操作、地址赋值、取值操作
package main
import (
"fmt"
"reflect"
)
func main() {
// (1) 获取地址:&变量
// &变量:获取变量地址
var x = 10
fmt.Printf("赋值之前x的对应地址: %p\n", &x)
x = 100
fmt.Printf("赋值之后x的对应地址: %p\n", &x)
// (2) 地址赋值: 指针类型或地址类型
// 可以写成 var p = &x,但刚开始的时候不建议这么写
var p *int // p 是一个整型指针类型
p = &x
fmt.Println(p)
// (3) 取值操作:*指针变量
// *p就是拿到地址当中的数据,与原有的数据类型一致,不是什么地址类型
fmt.Println(*p, reflect.TypeOf(*p))
*p = 101
fmt.Println(x)
}
网友评论