美文网首页
2023-10-29 第二阶段(指针)

2023-10-29 第二阶段(指针)

作者: 护念 | 来源:发表于2023-10-28 14:30 被阅读0次

    这是第二部分学习笔记

    关于指针

    go中的指针相比c中简单不少,他没有指针的运算,所以比较安全;用的最多的是作为引用来使用。

    1. 指针关键点

    其实关键的几个点记住就行了。

    a := 10
    
    ptr := &a // 取变量a的地址
    b := *ptr    // 指针的变量值
    *ptr = 20  // 改变指针变量的值
    
    var p *int // int型指针
    c := 30
    p = &c 
    
    // 测试
    fmt.Printf("%p\n", p)
    // 0xc0000a6018
    fmt.Println(a, b, c)
    //20 10 30
    

    2. 对于引用类型,申明后不会分配内存没法直接使用

    这点非常值得注意,也很容易出错。

    错误示范

     var p *int // 这里是一个空指针<nil>
    
    *p = 20  // 直接指针变量赋值 不行
    

    报错如下:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1057602]
    

    3. new 和 make的作用在于会分配内存

    • new的语法,它用的不多
    new(T) *T  // 返回一个指针类型
    
    • make主要用于 map、slice、chan (返回的是类型-非指针),因为这些类型都是引用,相当于这些类型分配内存的快捷方式
    a := new(int)
    *a = 20
    
    fmt.Printf("a地址:%p; a变量%v", a, *a)
    //a地址:0xc0000a6018; a变量20% 
    

    4. 空指针

    var a *int
    if a == nil {
      fmt.Println("a是空指针")
    } else {
      fmt.Println("a是非空指针")
    }
    

    相关文章

      网友评论

          本文标题:2023-10-29 第二阶段(指针)

          本文链接:https://www.haomeiwen.com/subject/okqmidtx.html