go语言内存,地址,指针

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42150559/article/details/94428639

变量的内存,地址,指针

指针就是地址
打印出变量的内存和地址
&a可以取到a的地址

简单说可以说地址就是索引,就是门牌号,内存就是仓库,里面存了东西,存了值

package main
import "fmt"

func main(){
	fmt.printf(a)//变量的内存
	fmt.printf(&a)//变量的地址 
}

保存某个变量的地址

int保存int的地址,**int保存int的地址

//定义一个变量p,类型为*int
var p *int
//指针变量指向谁,就把谁的地址给指针变量
//现在p就是a的16进制的地址
p=&a

直接赋值地址

现在*p操作的不是内存,不是1,2,3,而是p的地址

*p=666

go语言有几个特点:

使用 nil 代替其他语言的 null,也就是 nil 表示空
go的指针比C好用不需要 ->,而是用 . 表示

var p *int
p = nil

使用指针时注意,指针一定要有指向
来个错误实例

var p *int
p = nil
*p=666
//会报错,没有指定memory

再来个正确示范

var p *int
p = nil
a:=10
//此时p就指向了a的地址不管指向什么,一定要有指向
p=&a
*p=666

用new语法来开辟一个内存空间

go里面比C好用的地方就是,我们new完的内存空间不需要释放,go有gc,节省了开发时间

var p *int
//让p指向一个合法的内存空间
//因为p是*int类型的,所以new里面也要int类型
p = new(int)
*p=666

也可以使用自动推导类型

//因为new里面也要int类型,所以自动推导出p是*int类型
p := new(int)
*p=666

变量的传递

在方法swap中,其实传递的是a,b的内存,同时a,b int的时候,新建了两个a,b的引用变量,所以才会导致输出不同
方法里输出的是方法中的a,b
可以把看做a,b只是一个壳子,用来保存值
而swap方法入参时自己会新建一个a,b的空壳子(a,b int)

func swap (a,b int){
	a,b=b,a
	printf(a,b)//20.10
}
func main(){
a,b :=10,20
swap(a,b)
printf(a,b)//10.20
}

地址的传递

地址交换就能把值交换成功

func swap (a,b *int){
	*a,*b=*b,*a
	printf(a,b)//20.10
}
func main(){
a,b :=10,20
swap(&a,&b)
printf(a,b)//20,10
}

猜你喜欢

转载自blog.csdn.net/qq_42150559/article/details/94428639