go 3.02 指针
创建时间:2019-05-21 16:23
阅读:
变量内存和指针地址 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。
1 2 3 4 5 6 func main() { // 每个变量有两层含义:变量的内存, 变量的地址 var a int = 10 fmt.Printf("a = %d \n", a) // 变量的内存 fmt.Printf("&a = %v \n", &a) // 取地址,取变量a的内存地址 }
打个比喻帮助理解: 内存 -> 想像成教室 &a -> 想像成教室的门牌号 教室 存放 桌子 内存存放数据: a = 10
指针的基本使用 保存某个变量的地址,需要指针类型 如:*int保存int的地址,**int保存*int的地址 声明指针类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func main(){ var a int = 10 var p *int //声明p为指针类型 p = &a fmt.Printf("p = %v, &a = %v \n", p, &a) *p = 666 // *p操作的不是p的内存,是p所指向的内存(就是a) fmt.Printf("*p = %v, a=%v\n", *p, a) var q **int // 声明一个指针的指针q q = &p // 把p的内存地址赋值给q fmt.Printf("q = %v,&p = %v\n", q, &p) var b int = 20 *q = &b // 使用*q操作p的值,即让p指向b的内存地址 fmt.Printf("*p= %v", *p) //由于p的指向变成了b的地址,所以这里*p就变成了b的值 }
不要操作没有合法指向的内存 1 2 3 4 5 6 7 8 func main() { // 不要操作没有合法指向的内存(空批针) var p *int p = nil fmt.Printf("p = %v\n", p) *p = 666 // panic: runtime error: invalid memory address or nil pointer dereference // 这样操作没有合法向的内存会崩溃 }
new函数的使用 1 2 3 4 5 6 7 8 func main() { var p *int // 声明p为指针类型 p = new(int) // p 指向合法内存,有合法内存后,可以操作内存 fmt.Printf("p = %v\n", p) *p = 666 //可以操作内存 fmt.Printf("*p = %v \n", *p) }
值传递与地址传递 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 func swap(a, b int) { a, b = b, a fmt.Printf("swap:a=%d,b=%d\n", a, b) } func swap02(p1, p2 *int) { *p1, *p2 = *p2, *p1 fmt.Printf("swap02:*p1=%d,*p2=%d\n", *p1, *p2) } func main() { var a, b int = 10, 20 swap(a, b) fmt.Printf("main:a=%d,b=%d\n", a, b) swap02(&a, &b) //通过地址交换,从而改变了a,b的内容 fmt.Printf("main:a=%d,b=%d\n", a, b) }
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 rootid@126.com
文章标题: go 3.02 指针
本文作者: Shawn
发布时间: 2019-05-21, 16:23:26
最后更新: 2019-05-23, 16:41:42
原始链接: https://gitrootid.github.io/2019/05/21/golang/go-3-02-指针_/
版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。