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
}