指针的概念
一个指针变量可以指向任何一个值的内存地址,它指向的那个值的内存地址,在32位机器上占用4个字节,在64位机器上占用8个字节,并且与它所指向的值的大小无关。
指针可以指向任何类型的值,但是使用时指定指针的类型在实际编码中具有重要意义 在指针类型前面加上 *号 用来获取指针所指向的内容
使用一个指针引用一个值被称为间接引用
总结:
- 主要用于管理内存
- 指针是一个特殊的变量
- 存储的是另一个变量的内存地址
- 指针是存储另一个变量的内存地址的变量
- 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址
- 一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。
在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,现在a被认为指向b。
指针的作用及应用场景
作用
- 节省内存空间,提高执行效率(当操作的数据量较大规模时)
- 访问变量的值
应用场景
- 修改变量的值
- 访问变量的值
获取变量的地址
Golang语言的获取地址符号是&,放到一个变量前使用就会返回相应变量的内存地址
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("变量的地址:%X\n", &a) // 变量的地址:20818a220
}
指针变量操作
- 先定义变量,再定义指针去取变量的地址,那么这个变量存储的就是地址,实际的值是这个地址指向的空间
package main
import "fmt"
func main() {
// 先定义变量,再定义指针去取变量的地址
var num1 int = 100
fmt.Printf("变量的地址:%v\n", &num1) // 变量的地址:0xc00006c008
// 定义一个指针类型的变量,那么这个变量存储的就是地址,实际的值是这个地址指向的空间
// 定义一个指针类型的变量去指向num1
var num2 *int = &num1
fmt.Printf("变量的地址:%v\n", &num2) // 变量的地址:0xc00007c020
}
取地址操作符& : 一般指针操作当中经常使用,&使用地址
取值操作符* : 一般在指针操作中,*根据地址找该地址指向空间的值
*int : 指向整型
*float32 :指向32位的浮点型
空指针
当一个指针被定义后没有分配到任何变量时,它的值是 nil , nil指针 也称为空指针。nil在概念上和其他语言的null,None,nil,NULL一样,都指代零值或空值。一个指针变量通常缩写为 ptr
空指针判断:
if(ptr != nil) // ptr 不是空指针
if(ptr == nil) // ptr是空指针
注意事项:
值类型一般都有对应的指针类型,格式 数据的类型 比如int-> int float64->*float640x开头的十六进制的一组数据go语言中引用类型有哪些?指针,slice,map,chan,interface值类型:变量存储的值是值类型,通常在栈中分配引用类型:变量存储的是地址,这个地址对应的空间存储的才是实际的值,一般引用类型在堆中分配,一旦无任何变量来引用这块空间,那么会被操作系统进行垃圾回收。go语言的指针没有指针运算,因为指针的乱引用会导致的内存泄漏,以及引发一连串程序的崩溃修改指针指向变量的值,但是不会修改地址,通过指针改掉了指向变量对应的值一个指针变量可以指向任何一个值的内存地址指针也可以指向另一个指针,并且可以进行任意深度的嵌套,导致你可以有多级的间接引用,但在大多数情况这会使你的代码结构不清晰当一个指针被定义后没有分配到任何变量时,它的值为 nil。对一个空指针的反向引用是不合法的,并且会使程序崩溃
最后
刚学golang,希望大家监督并且一起努力
有兴趣的小伙伴,欢迎关注我订阅号:EntrepreneurialG