golang第七天,语言指针

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战golang

指针的概念

程序在内存中存储它的值,每一个内存块都有一个地址,而存储这个地址的变量被称为指针变量,指针markdown

一般用十六进制数表示,如:0x6b0820或0xf84001d7f0post

一个指针变量能够指向任何一个值的内存地址,它指向的那个值的内存地址,在32位机器上占用4个字节,在64位机器上占用8个字节,而且与它所指向的值的大小无关。编码

指针能够指向任何类型的值,可是使用时指定指针的类型在实际编码中具备重要意义 在指针类型前面加上*号用来获取指针所指向的内容spa

使用一个指针引用一个值被称为间接引用操作系统

总结:指针

  • 主要用于管理内存
  • 指针是一个特殊的变量
  • 存储的是另外一个变量的内存地址
  • 指针是存储另外一个变量的内存地址的变量
  • 咱们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址
  • 一个指针变量能够指向任何一个值的内存地址它指向那个值的内存地址。

image.png

在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,如今a被认为指向b。code

指针的做用及应用场景

做用

  1. 节省内存空间,提升执行效率(当操做的数据量较大规模时)
  2. 访问变量的值

应用场景

  1. 修改变量的值
  2. 访问变量的值

获取变量的地址

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是空指针
复制代码

注意事项:

  1. 值类型通常都有对应的指针类型,格式 数据的类型 好比int-> int float64->*float64
  2. 0x开头的十六进制的一组数据
  3. go语言中引用类型有哪些?指针,slice,map,chan,interface
  4. 值类型:变量存储的值是值类型,一般在栈中分配
  5. 引用类型:变量存储的是地址,这个地址对应的空间存储的才是实际的值,通常引用类型在堆中分配,一旦无任何变量来引用这块空间,那么会被操做系统进行垃圾回收。
  6. go语言的指针没有指针运算,由于指针的乱引用会致使的内存泄漏,以及引起一连串程序的崩溃
  7. 修改指针指向变量的值,可是不会修改地址,经过指针改掉了指向变量对应的值
  8. 一个指针变量能够指向任何一个值的内存地址
  9. 指针也能够指向另外一个指针,而且能够进行任意深度的嵌套,致使你能够有多级的间接引用,但在大多数状况这会使你的代码结构不清晰
  10. 当一个指针被定义后没有分配到任何变量时,它的值为 nil。对一个空指针的反向引用是不合法的,而且会使程序崩溃

最后

刚学golang,但愿你们监督而且一块儿努力

有兴趣的小伙伴,欢迎关注我订阅号:EntrepreneurialG

相关文章
相关标签/搜索