zoukankan      html  css  js  c++  java
  • Go 指针

    变量是存储值得地方。 借助声明变量时使用的名字来区分。

    指针的值是一个变量的地址。一个指针指示值所保存的位置。不是所有的值都有地址,但是所有的变量都有。使用指针,可以在无需知道变量名字的情况下,间接读取或者更新变量的值。

    Go语言支持指针类型*T,指针的指针**T。

    指针声明

    在指针类型变量前面加上 *(取值符)来获取指针所指向的内容。
    在值类型变量前面加上 &(取地址符)来获取该变量的指针。

    如果一个变量声明为 var x int:

      &x 获取一个指向整型变量的指针,它的类型是整形指针 *int;

      如果 p := &x,那么p指向x,p执行的变量写成*p;

      *p 表示获取变量的值,是一个整型,如果*p出现在赋值操作左边,则用于更新变量的值。

    package main
    
    import "fmt"
    
    func incr(p *int) int {
    	*p++
    	fmt.Printf("value type: %T
    ", *p)
    	return *p    //p是一个整型指针,*p代表指针所指向的值
    }
    func main() {
    	v := 1
    	incr(&v)  // &v 是1所在的地址
    	fmt.Println(&v) //打印2的地址,结果为 0xc420084008
    	fmt.Println(incr(&v))  //现在v的值为3
    
    }
    

      

      

     从指针获取指针指向的值

    正如上面所说,x 是一个普通变量,&x 获取一个指向整型变量的指针,它的类型是整形指针 *int,在对指针使用*操作,也就是指针取值

    package main
    import (
    	"fmt"
    )
    func main() {
    	// 准备一个字符串类型
    	var description = "This is the pointer example 001"
    	// 对字符串取地址, pointer类型为*string
    	pointer := &description
    	// 打印pointer的类型
    	fmt.Printf("pointer type: %T
    ", pointer)
    	// 打印pointer的指针地址
    	fmt.Printf("address: %p
    ", pointer)
    	// 对指针进行取值操作
    	value := *pointer
    	// 取值后的类型
    	fmt.Printf("value type: %T
    ", value)
    	// 指针取值后就是指向变量的值
    	fmt.Printf("value: %s
    ", value)
    }
    

      

    运行结果如下:

    pointer type: *string
    address: 0xc0000101e0
    value type: string
    value: This is the pointer example 001

    使用指针修改值

    在这个例子中,我们将a指向255的地址,然后通过*a取值并加一,可以看到新值已经加1.

    package main
    
    import (  
        "fmt"
    )
    
    func main() {  
        b := 255
        a := &b
        fmt.Println("address of b is", a)
        fmt.Println("value of b is", *a)
        *a++
        fmt.Println("new value of b is", b)
    }
    

      

    输出:

    address of b is 0xc0000a2000
    value of b is 255
    new value of b is 256

    空指针

    当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。

    nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var ip *int
        var sp *string
    
        if ip == nil {
            fmt.Println("ip == nil")
        }
        if sp == nil {
            fmt.Println("sp == nil")
        }
    }
    

      

    结果如下:

    ip == nil
    sp == nil

    请注意:定义的不同类型的零值不能用于比较运算

      

  • 相关阅读:
    JavaScript作用域闭包(你不知道的JavaScript)
    Python笔记---错误笔记
    Go语言核心之美 1.5-作用域
    Android经常使用自己定义控件(二)
    Java开发者最经常使用19个Linux命令
    Python: scikit-image binary descriptor
    android 自己定义状态栏和导航栏分析与实现
    程序猿增加新团队的那些坑
    LeetCode 06 ZigZag Conversion
    【UWP通用应用开发】控件、应用栏
  • 原文地址:https://www.cnblogs.com/nurruden/p/9670987.html
Copyright © 2011-2022 走看看