指针
教程地址:点击去往视频教程
1. 指针是什么
在前面我们讲过,变量声明或赋值后,就会在内存中开辟一个空间,用来存储这个变量。
问题来了:我们怎么知道这个变量存在内存中的哪个位置呢?
答案就是每一个内存都有一个地址,通过内存地址
,我们可以准确的找到数据所在的位置。
指针的声明语法:var 变量名(指针名) 变量类型(指针类型)
,比如var p *int
通过上述的声明语法,大家也可以看的出,指针也是一个变量,只不过这个变量比较特殊。
指针变量存储的内存地址
。
所以指针就是存储了一个内存地址,并且指向这个内存地址所代表的内存空间。
了解了指针之后,我们来看一个代码:
func main() {
var a int = 10
var p *int = &a
*p = 20
fmt.Println(a)
}
1
2
3
4
5
6
2
3
4
5
6
上述代码,a
输出为20,因为p最终修改的是a
所在的内存空间。
指针的零值为nil,也就意味着此指针不存有一个内存地址,这时候如果对指针进行操作就会报一个错误:
invalid memory address or nil pointer dereference
。思考为什么?
2. 指针操作
&
是取地址操作符*
是取值操作符*数据类型
是指针类型
func main() {
//声明指针 此时a为nil
var a *int
old := 10
//指针赋值 此时指针可以操作
a = &old
fmt.Printf("打印a的值是一个地址:%v \n", a)
//如果想要获取指针指向的值,需要使用*操作符
fmt.Println("获取指针指向的值:", *a)
//修改a的值,则old的值也会变
*a = 20
fmt.Printf("old的值:%d \n", old)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
//声明指针 此时a为nil
var a *int
//这会报错,原因在于此时a是一个空指向,没有一个可用的内存地址供其操作
*a = 10
}
1
2
3
4
5
6
2
3
4
5
6
上述代码问题,如果解决呢?这就需要用到new
这个函数。
new
是提前在内存中申请一块内存,这样就获得了一个内存地址,就不会出现上述报错了。
func main() {
//声明指针 此时a为nil
var a *int
//初始化后的内存空间 其值为对应类型的零值
a = new(int)
*a = 10
fmt.Println(*a)
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8