这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战golang
程序在内存中存储它的值,每一个内存块都有一个地址,而存储这个地址的变量被称为指针变量,
指针
markdown一般用十六进制数表示,如:0x6b0820或0xf84001d7f0post
一个指针变量能够指向任何一个值的内存地址,它指向的那个值的内存地址,在32位机器上占用4个字节,在64位机器上占用8个字节,而且与它所指向的值的大小无关。编码
指针能够指向任何类型的值,可是使用时指定指针的类型在实际编码中具备重要意义 在指针类型前面加上*号
用来获取指针所指向的内容spa
使用一个指针引用一个值被称为间接引用操作系统
总结:指针
在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,如今a被认为指向b。code
做用
应用场景
Golang语言的获取地址符号是&,放到一个变量前使用就会返回相应变量的内存地址orm
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->*float64
- 0x开头的十六进制的一组数据
- go语言中引用类型有哪些?指针,slice,map,chan,interface
- 值类型:变量存储的值是值类型,一般在栈中分配
- 引用类型:变量存储的是地址,这个地址对应的空间存储的才是实际的值,通常引用类型在堆中分配,一旦无任何变量来引用这块空间,那么会被操做系统进行垃圾回收。
- go语言的指针没有指针运算,由于指针的乱引用会致使的内存泄漏,以及引起一连串程序的崩溃
- 修改指针指向变量的值,可是不会修改地址,经过指针改掉了指向变量对应的值
- 一个指针变量能够指向任何一个值的内存地址
- 指针也能够指向另外一个指针,而且能够进行任意深度的嵌套,致使你能够有多级的间接引用,但在大多数状况这会使你的代码结构不清晰
- 当一个指针被定义后没有分配到任何变量时,它的值为 nil。对一个空指针的反向引用是不合法的,而且会使程序崩溃
刚学golang,但愿你们监督而且一块儿努力
有兴趣的小伙伴,欢迎关注我订阅号:
EntrepreneurialG