【彻底读懂go语言指针--初学者】

思考:为什么会出现指针,如果没有指针我们的程序又会出现什么样的问题? 首先阅读这段代码,思考一下程序中a的值能不能成功被改变,即最终输出是什么?

package main
import "fmt"
func main(){
	var a int =1
	changeValue(a)
	fmt.Println(a)
}

func changeValue(p int){
	p=10
}
分析

接下来对以上代码进行分析,当我们去定义变量a的时候,其实就是在我们的内存池去开辟一个空间去存放a=1,类型int代表a在内存中一共占用了多少个字节,当然每一个内存都会对应一个地址,这个地址可以认为是当前内存的一个标识,如下图:

在这里插入图片描述

当我们调用函数changeValue的时候,形参p是有一个默认值0的,当然也会为它分配一个内存和地址,如下图:

在这里插入图片描述

紧接着当调用函数的时候,会把a=1的值传递给p,所以p的值从默认值变成了a=1,如下图:

在这里插入图片描述

记下来执行函数体的内容,把p的值赋值成10,如下图:

在这里插入图片描述

此时调用的函数changeValue已经执行完毕,所以执行输出a的值的时候还是a=1,a的值并没有发生改变,所以这是一个典型的值传递,接下来我们使用指针,代码如下:

package main
import "fmt"
func main(){
	var a int =1
	changeValue(&a)
	fmt.Println(a)
}

func changeValue(p *int){
	*p=10
}

此时临时变量p是一个指针类型,是一个指向整型类型的指针类型,指针类型本身也是有地址的,并且会开辟一个默认地址0X00000000,如下图:

在这里插入图片描述

当调用函数的时候,把a的地址传入给p,如图:

在这里插入图片描述

所以当我们执行函数体,p=10,就会通过p来找到a的地址,然后p=10,修改了a的值,如下图:

在这里插入图片描述

所以此时输出a的值就为10,这就是引用传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胡桃木子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值