go 3.02 指针

  1. 变量内存和指针地址
  2. 指针的基本使用
  3. 不要操作没有合法指向的内存
  4. new函数的使用
  5. 值传递与地址传递

变量内存和指针地址

指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。

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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏