• go之变量、指针、引用地址


    一、值类型

    • 定义和说明
    定义:变量直接指向存在内存中的值,我们称之为值类型。
    
    值类型的变量的值存储在栈中。
    值类型 将一个变量赋值给另一个变量 被称为值拷贝
    
    • 实例
    package main
    
    import "fmt"
    
    func main(){
    	var num1,num2 int
    	num1 = 10
    	num2 = num1 // 值类型赋值操作
    
    	fmt.Println(num1,num2) // 10 10
    
    	num1 = 20
    	fmt.Println(num1,num2) // 20 10
    }
    

    二、指针类型

    • 定义
    一个变量指向内存中值所在的内存地址,我们称这个变量为指针类型
    
    go 语言中的指针与C/C++ 中的指针用法是一样的,只是出于安全性的考虑go增加了:
        1、不同类型的指针不能互相转化
        2、任何普通指针类型*T和uintptr之间不能互相转化
        3、指针变量不能进行运算
    
    • 实例
    package main
    
    import "fmt"
    
    func main(){
    	var num int = 100
    	var ptr *int  // 类型前 加 * 表示这是指针类型,指针类型的初始值为nil ,和其他语言的NUll,None一样
    		ptr = &num // & 取num 变量的内存地址。 因为ptr 是指针,指向的是内存地址,所以需要赋值操作的是内存地址
    		fmt.Println("ptr 指针的值:",ptr)
    		fmt.Println("*ptr 指针的值:",*ptr) // * 取指针内存地址所指向的值
    
    		num = 200
    		fmt.Println("*ptr 指针的值:",*ptr)
    
    }
    
    
    结果:
    ptr 指针的值: 0xc000048080
    *ptr 指针的值: 100
    *ptr 指针的值: 200
    
    • *ptr 没有操作,为什么值发生了变化
    ptr 是指针类型,并被赋予了 num 的内存地址,当num值发现变化时,实际也就是 ptr 内存地址所对应的值变了
    因为 ptr内存地址所对应的 内存值就是num的值
    

    三、值与内存地址与指针

    1、变量是抽象出来的概念,go语言程序运行时即表示内存值
    2、内存地址即 内存值所在的内存空间的编号
    3、指针变量:是一种占位符,用于引用计算机的内存地址。可理解为内存地址的标签
    

    四、取地址与解引用

    • 说明
    在go语言中我们可以通过
        & 是取地址符号 , 即取得某个变量的地址 , 如 ; &a
        * 是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值
    
    • 运用
    package main
    
    import "fmt"
    
    func main(){
    	var n1,n2,n3 int
    	n1 = 100
    	n2 = 200
    	n3 = 3
    	swap(&n1,&n2) // 传内存地址
    	add(&n3) // 取内存地址
    	fmt.Println(n1)  // 200
    	fmt.Println(n2) // 100
    	fmt.Println(n3) // 4
    
    
    	var num *int  // 申明一个int 指针类型
    	num = &n3  // 所以可以赋值 内存地址
    	add(num)
    	fmt.Println("num指针变量的内存值:",*num) // *num == 5 
    	// 此时n3 == 5
    }
    
    
    // 传入 两个指针类型的数据.
    func swap(i,j *int){
    	*i,*j = *j,*i // 值的替换
    }
    
    func add(num *int){
    	// *num 解引用
    	*num = *num + 1
    }
    

    五、引用类型

    golang 没有引用类型。。。。。
    
  • 相关阅读:
    leetcode 141 环形链表
    [转载]Tensorflow中reduction_indices 的用法
    SIFT特征原理与理解
    numpy切片和布尔型索引
    IPython的使用
    [文献阅读]基于卷积神经网络的高光谱图像深度特征提取与分类
    验证码校验
    防止表单重复提交
    MyBatis 一对一,一对多,多对多
    MySQL基础内容
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/10624202.html
Copyright © 2020-2023  润新知