• Go--指针


    Go语言中的指针

    任何程序数据都需要载入内存中,那么在内存中都会有一个内存地址,这其实就是指针。为了保存一个数据在内存中的地址,我们就需要用到指针变量

    Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作其实也非常简单,&(取地址)和*(根据内存地址取值)

    指针地址和指针类型

    每个变量在运行的时候都拥有一个地址,这个地址代表变量在内存中的地址。Go语言中利用&字符放在变量的前面对变量进行操作       

    ptr := &v    // v的类型为T   
    
    • v:代表被取地址的变量,类型为T
    • ptr:用于接收内存地址的变量,ptr的类型为*T,叫做T的指针类型。*代表指针

    指针取值

    对于普通变量使用&操作符取内存地址以后就会获得这个变量的指针,然后可以对指针使用*操作,也就是利用指针取值

    func main() {
    	//指针取值
    	a := 10
    	b := &a // 取变量a的地址,将指针保存到b中
    	fmt.Printf("type of b:%T
    ", b)
    	c := *b // 指针取值(根据指针去内存取值)
    	fmt.Printf("type of c:%T
    ", c)
    	fmt.Printf("value of c:%v
    ", c)
    }
    

      

    type of b:*int
    type of c:int
    value of c:10
    

      

    总结:取地址操作符&和取值操作符*是一对互补的操作符,&取出内存地址,*根据内存地址取出地址指向的值,然后再进行后续的操作

     变量、指针地址、指针变量、取地址、取值的相互的关系:

    • 对变量进行取地址&操作,可以获取这个变量的指针地址
    • 指针变量的值是指针地址
    • 对指针变量进行取值*操作,就可以获取指针变量指向的变量的值
    func modify1(x int) {
    	x = 100
    }
    
    func modify2(x *int) {
    	*x = 100
    }
    
    func main() {
    	a := 10
    	modify1(a)
    	fmt.Println(a) // 10
    	modify2(&a)
    	fmt.Println(a) // 100
    }
    

      

    new和make

    func new(Type) *Type
    
    • type表示类型,new函数只接受一个参数,这个参数就是一个类型
    • *type表示指针类型,new函数返回一个指向该类型内存地址的指针

    new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值

    之前的代码中,var a *int  只是声明了一个指针变量a但是没有初始化成功,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它做赋值操作

    func main() {
    	var a *int
    	a = new(int)
    	*a = 10
    	fmt.Println(*a)
    }
    

    make

    make也是用于内存分配的,区别于new,它适用于slice、map以及chan类型的创建,而且它的返回类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以也就没有必要返回他们的指针了。

    func make(t Type, size ...IntegerType) Type
    

    make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。

    如map中要是只声明变量是一个map类型,是不能进行操作的,必须利用make先对map进行初始化操作之后能可以对键值对进行赋值。

    func main() {
    	var b map[string]int
    	b = make(map[string]int, 10)
    	b["沙河娜扎"] = 100
    	fmt.Println(b)
    }
    

      

    make和new的区别:

    • 二者都是用来做内存分配的
    • make只用于slice、map、channel的初始化,返回的还是这三个引用类型的本身
    • new用于类型的内存分配,并且内存对应的值为类型的零值,返回的是指向类型的指针
  • 相关阅读:
    Solution 「AGC 031E」Snuke the Phantom Thief
    Solution Set 「LOCAL」冲刺省选 Round XXIX
    Solution Set 「LOCAL」冲刺省选 Round XXVIII
    Solution 「LOCAL」Minimal DFA
    Solution 「ZJOI 2015」「洛谷 P3343」地震后的幻想乡
    Solution Set 「LOCAL」冲刺省选 Round X
    Solution Set 「LOCAL」冲刺省选 Round VII
    Solution 「WC 2014」「洛谷 P3920」紫荆花之恋
    虚拟机下CentOS7开启SSH连接
    linux c 共享内存 消息队列 信号量
  • 原文地址:https://www.cnblogs.com/tulintao/p/11831357.html
Copyright © 2020-2023  润新知