指针

指针是存储另一个变量的内存地址的变量。 例如: 变量B的值为100, 地址为0x1122。变量A的值为变量B的地址0x1122,那么A就拥有了变量B的地址,则A就成为指针。Go语言中通过&获取变量的地址。通过* 获取指针所对应的变量存储的数值。

package main

import "fmt"

func main() {
    // 定义一个变量
    a := 10
    fmt.Printf("a的地址是:%p\n", &a) // a的地址是:0xc00000a0b8

    // 创建一个指针
    // 指针的声明 通过*T 标识T类型的指针
    var i *int     // int类型指针
    var f *float64 // float64类型指针
    fmt.Println(i) // <nil>
    fmt.Println(f) // <nil>

    // 因为指针存储的是变量的地址,所以指针存储值
    i = &a
    fmt.Println(i)  // 0xc00000a0b8
    fmt.Println(*i) // 10
    *i = 100
    fmt.Println(*i) // 100
    fmt.Println(a)  // 100
    // 通过对 *i 赋另一个值来更改 “对象”,这样 a 也会随之更改。
}

数组指针

数组指针,是一个指向数组,存储数组的地址。

package main

import "fmt"

func main() {
    // 创建一个普通数组
    arr := [3]int{1, 2, 3}
    fmt.Println(arr) // [1 2 3]

    // 创建一个指针,用来存储数组的值
    var p *[3]int
    p = &arr       // 将数组arr的地址,存储到数组指针p上。
    fmt.Println(p) // &[1 2 3]

    // 获取数组指针中的具体数据,和数组指针自己的地址
    fmt.Println(*p) // [1 2 3]
    fmt.Println(&p) // 0xc00000a0b8

    // 修改数组指针中的数据
    (*p)[0] = 100
    fmt.Println(arr) // [100 2 3]

    // 简化写法
    p[1] = 200
    fmt.Println(arr) // [100 200 3]
}

指针数组

其实就是一个普通数组,只是存储数据类型是指针。

package main

import "fmt"

func main() {
    // 定义4个变量
    a, b, c, d := 1, 2, 3, 4

    arr1 := [4]int{a, b, c, d}
    arr2 := [4]*int{&a, &b, &c, &d} // 将所有变量的指针,放进arr2里面

    fmt.Println(arr1) // [1 2 3 4]
    fmt.Println(arr2) // [0xc00000a0b0 0xc00000a0b8 0xc00000a0c0 0xc00000a0c8]

    // 修改arr1中的值
    arr1[0] = 100
    fmt.Println("arr1的值:", arr1) // arr1的值: [100 2 3 4]

    fmt.Println("a=", a) // a= 1

    // 修改arr2中的值
    *arr2[0] = 200
    fmt.Println("arr2的值:", arr2) // arr2的值: [0xc00000a0b0 0xc00000a0b8 0xc00000a0c0 0xc00000a0c8]
    fmt.Println("a=", a)         // a= 200

    // 循环数组,用*取数组中的所有值
    for i := 0; i < len(arr2); i++ {
        fmt.Println(*arr2[i])
    }
}

指针函数

如果一个函数返回结果是一个指针,那么这个函数就是一个指针函数。

package main

import "fmt"

func main() {
    // 函数默认为指针,不需要用*号
    a := fun1
    fmt.Println(a) // 0x10a0e60
    a1 := fun1()
    fmt.Printf("a1的类型:%T,a1的地址是%p 数值为%v \n", a1, &a1, a1) // a1的类型:[]int,a1的地址是0xc00000a0b8 数值为[1 2 3]

    a2 := fun2()
    fmt.Printf("a2的类型:%T,a2的地址是%p 数值为%v \n", a2, &a2, a2) // a2的类型:*[]int,a2的地址是0xc00000a0c0 数值为[1 2 3]
    fmt.Printf("a2的地址:%p\n", a2)                          // a2的地址:0xc00000a0b8
}

// 一般函数
func fun1() []int {
    c := []int{1, 2, 3}
    return c
}

// 指针函数,返回指针
func fun2() *[]int {
    c := []int{1, 2, 3}
    fmt.Printf("c的地址:%p\n", &c) // c的地址:0xc00000a0b8
    return &c
}

指针参数

package main

import "fmt"

func main() {
    s := 10
    fmt.Println(s) // 10
    fun10(&s)
    fmt.Println(s) // 100
}

// 接收一个int类型的指针作为参数
func fun10(a *int) {
    // 通过指针修改值
    *a = 100
}

Last modification:November 16, 2022
If you think my article is useful to you, please feel free to appreciate