• 【go语言入门笔记】12、指针


    指针是一个代表着某个内存地址的值

    说到指针,会让许多人“谈虎色变”,尤其对指针偏移、运算、转换都非常恐惧。
    其实,指针是使C/C++语言有极高性能的根本,在操作大块数据和做偏移时方便又便捷。
    C/C++中指针饱受诟病的根本原因是指针运算和内存释放。
    C/C++语言中的裸指针可以自由偏移,甚至可以在某些情况下偏移进入操作系统核心区域。
    我们的计算机操作系统经常需要更新、修复漏洞的本质,是为解决指针越界访问所导致的“缓冲区溢出”。

    指针概念在Go语言中被拆分为两个核心概念:

    • 类型指针:允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移运算
    • 切片,由指向起始元素的原始指针、元素数量和容量组成。

    受益于这样的约束和拆分,Go语言的指针类型变量拥有指针的高效访问,但又不会发生指针偏移,从而避免非法修改关键性数据问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。

    1 、认识指针地址、指针类型

    每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。

    Go语言中使用&操作符放在变量前面对变量进行“取地址”操作。

    格式如下:p := &变量

    例:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	a := "hello"
    	p := &a //用符号 & 取变量a的地址
    	fmt.Println(p)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:
    在这里插入图片描述

    • 输出了变量a的内存地址
    • 输出值在每次运行是不同的
    • 在32位平台上,将是32位地址;64位平台上是64位地址。

    2、 从指针获取指针指向的值

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

    例:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	a := "hello"
    	p := &a
    	fmt.Println(p)  //输出a的地址,p指针变量
    	fmt.Println(*p)  //输出a的地址存储的值
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:
    在这里插入图片描述

    3、使用指针修改值

    在这里插入图片描述

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	a := "hello"  //变量a
    	p := &a       //p指向a变量地址
    	b := "hello world" //变量b
    	*p = b            //修改指针p指向的内存内容变
    	fmt.Println(a)   //输出a的地址存储的值
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果:
    在这里插入图片描述

    4、new()函数创建指针

    语法:指针变量 := new(数据类型)

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	c := new(string)
    	*c = "hello world" 
    	fmt.Println(*c) 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

  • 相关阅读:
    FFN -> GLU -> GAU
    零基础,三个月内,找到??? java后端开发工作
    【appium】App类型、页面元素|UiAutomator与appium|App元素定位
    leetcode每天5题-Day42
    springmvc静态资源配置
    微信小程序会议OA系统
    IT行业哪个方向比较好就业?
    openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose
    conda和pip查看、配置源
    VSCode实用远程主机功能
  • 原文地址:https://blog.csdn.net/m0_48300767/article/details/126024595