指针传引用

本文详细解析了栈帧中变量的内存交换过程,通过swap2方法展示了如何通过地址值完成值交换。讨论了new关键字在堆内存中的作用,以及如何通过指针操作获取和设置变量的值。通过示例代码解释了指针、地址值和数据值之间的关系,帮助读者深入理解Go语言中的内存管理和指针操作。
摘要由CSDN通过智能技术生成

ath9SL
上图中main方法中声明了a和b两个变量,然后通过swap2方法完成值交换。很简单的过程。(通过地址值进行引用然后完成交换)

图右边是代码的在栈帧的的一个交换过程:

大概说一下:

  1. 首先初始化的main方法在栈帧 有两个内存空间 分别为0xaa000xbb00对应a和b的变量地址
  2. 然后运行到调用swap2 产生栈帧空间,空间内 有x和y两个变量形参。
  3. 然后swap2(&a,&b) 去地址值的方式把a和b的地址给了swap2方法 ,
  4. swap2方法 的*x,*y=*y,*x是做了一个值交换,首先第一个*x是取内存空间(我们之前说过 :等号左边的变量,代表变量所指向的内存空间)这里通俗来说就是*x是去main方法的栈帧下取到a的地址值(0xaa00)。
  5. 第三个*y是根据地址把值取(等号右边的变量,代表变量内存空间存储的数据值)到然后赋值给*x(0xaa00),取得的值为20 转化一下:0xaa00=20

一通百通

再来一个demo

主要看 new, new这个关键字是去(heap)堆内存申请一块内存空间,下面var p=new(*int)申请指针类型的内存 ,返回的是一块内存空间的地址值为0xc00001e090 ,想要给它赋值就必须进行取到0xc00001e090地址的空间*p,然后赋值*p=&i ,这个时候根据*p取得值是i的地址0xc0000be008值不是数据值,想要取得i的值需要再加个*就是**p,才能取到i的值。绕的一笔

func main() {
    var p =new(*int) //p 0xc00001e090
	var i int
	i=1000
	*p=&i
	fmt.Println(&i) //	0xc0000be008  i地址值
	fmt.Println(*p) //  0xc0000be008    i地址值
  fmt.Println(p)  //0xc00001e090     p变量的内存地址值
  fmt.Println(**p) // 1000          i的数据值1000
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉清风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值