【笔记】Go语言的指针

前言

Go语言的指针学习笔记

指针的声明与定义

声明指针变量

  • 声明一个指针,默认为空指针(nil),默认值为nil,值为0
  • 访问空指针会报错
  • 0~255为系统占用,不可以读写,如果读写会报错

数据类型:需要与所存储的数据类型对应

1
var p *数据类型

定义指针变量

&变量:通过&操作符,获取变量地址,赋值给指针变量

1
var p *数据类型 = &变量

定义野指针

  • 指针变量指向了一个未知的内存地址
  • 访问野指针会报错
1
var p *数据类型 = 0xFFFFFFFF

为指针变量创建一块内存

  • 在堆区开辟空间,将地址值赋值给指针
  • 其内存的空间的大小为指定数据类型的大小,其默认值为数据库类型默认值
  • 在Go语言中只需要开辟空间,不需要释放空间
1
p = new(数据类型)

指针的操作

  • Go语言的指针类型变量既拥有指针高效访问的特点,又不会发生指针偏移和运算,从而避免了非法修改关键性数据的问题

取址

  • 通过&变量名来获取变量的十六进制内存地址值
1
2
var num int = 0
&num

内存地址赋值

  • 将内存地址赋值给指针存储
1
2
var p *int
p = &num

取值

  • 通过*指针变量来获取或修改指针指向的实际数据

获取指针指向的值

1
*p

修改指针指向的值

1
*p = 0

函数参数地址传递

  • 以交换数据的函数为例
1
2
3
func 函数名(a *int, b *int) {
*a, *b = *b, *a
}

数组指针

声明数组指针

1
var p *[数组长度]数据类型

定义数组指针

  • 指向数组的指针
1
var p *[数组长度]数据类型 = &数组名

通过指针找到数组元素

1
(*p)[数组下标]
  • Go语言对指针的优化
1
p[数组下标]

切片指针

声明切片指针

1
var p *[]数据类型

定义切片指针

1
var p *[]数据类型 = &切片名

通过指针找到切片元素

1
(*p)[数组下标]

通过指针获取切片长度

1
len(*p)

通过指针遍历切片

1
2
3
for k, v := range *p {
...
}

与指针相关的输出

输出数据类型

1
fmt.Printf("%T", p)

输出地址

1
fmt.Printf("%p", p)

结构体指针

声明结构体指针

1
var 变量名 *结构体名

定义结构体指针

1
var 变量名 *结构体名 = &结构体变量名

通过结构体操作结构体属性

1
(*p).属性名 = 属性值
1
p.属性名 = 属性值

多级指针

二级指针

  • 存储指针的指针
1
pp = &p

完成

参考文献

哔哩哔哩——喔咔咔耶耶
哔哩哔哩——Python路飞