变量的内存,地址,指针
指针就是地址
打印出变量的内存和地址
&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
}