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

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

      

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/nurruden/p/9670987.html
Copyright © 2011-2022 走看看