1、指针的定义
func newPoint() { var a int = 10 //定义整数型指针 var p *int //此时出现nullpoint,因为p不知道指向的内存地址 fmt.Println(p) //同样报错,p没有指向的地址 *p = 67 fmt.Println(*p) p = &a //打印指针p指向的内存中存储的数据 fmt.Println(*p) //打印指针p存储的地址 fmt.Println(p) //打印整形变量a的地址 fmt.Println(&a) }
2、new函数的使用
func newPoint() { //定义一个整形指针的数据 var p *int //使用new函数,开辟一块内存空间 p = new(int) //将p指向的内存空间存储整数45 *p = 45 }
3、指针变量作为函数参数
//将变量a的内存地址传递给函数Update,Update函数修改的是指针指向的地址 func testPoint() { var a int = 60 Update(&a) fmt.Println(a) } func Update(a *int) { *a = 90 } //在内存中开辟的有两快地址,地址1存的是a 地址2存的是b //调用函数Update时,只是将内存b中的数据该了并没有修改a中存储的数据 func testPoint() { var a int = 60 Update(a) fmt.Println(a) } func Update(b int) { b = 90 }
4、数组指针
func arrayPoint() { nums := [10]int{1,2,3,4,5,6,7,8,9,10} var p *[10]int p = &nums //通过指针变量打印数组的值 fmt.Println(p[0]) updateArray(p) fmt.Println(nums) } //通过指针在函数中修改数组中的值 func updateArray(p *[10]int) { p[0] = 50 }
5、指针数组
func PointArray() { //定义一个指针数组 var p [2]*int i,j := 2,3 //将i和j的地址赋值给指针数组下角标为0和1的参数 p[0] = &i p[1] = &j for i := 0; i < len(p); i++ { fmt.Println(p[i]) fmt.Println(*p[i]) } } //打印结果,其中0xc00000a098存储的数值为2,0xc00000a0b0存储的数值是3 0xc00000a098 2 0xc00000a0b0 3
6、指针数组
func SlicePoint() { s := []int{1,2,3,4,5,6,7,8,9,10} var p *[]int p = &s fmt.Println(p) fmt.Println(*p) fmt.Println((*p)[0])//切片指针不支持p[0]这种写法 UpdateSlice(p) fmt.Println(*p) //利用循环的方式打印切片指针存储的值 for i := 0; i < len(*p); i++ { fmt.Println((*p)[i]) } for i, value := range *p { fmt.Println(i) fmt.Println(value) } } //通过切片指针修改切片的值 func UpdateSlice(p *[]int) { (*p)[0] = 100 }