思考:为什么会出现指针,如果没有指针我们的程序又会出现什么样的问题? 首先阅读这段代码,思考一下程序中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,这就是引用传递