指针

教程地址:点击去往视频教程open in new window

1. 指针是什么

在前面我们讲过,变量声明或赋值后,就会在内存中开辟一个空间,用来存储这个变量。

问题来了:我们怎么知道这个变量存在内存中的哪个位置呢?

答案就是每一个内存都有一个地址,通过内存地址,我们可以准确的找到数据所在的位置。

img

指针的声明语法: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

上述代码,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
func main() {
	//声明指针 此时a为nil
	var a *int
    //这会报错,原因在于此时a是一个空指向,没有一个可用的内存地址供其操作
	*a = 10
}
1
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