笔记 - 指针及数组指针

  • 概念
    指针是存储另一个变量的内存地址的变量
    一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址

    a :=10
    fmt.Println("a的数值:", a)
    fmt.Printf("%T\n", a)
  • 获取变量的地址

a :=10
fmt.Printf("变量的地址:p%x\", &a) // 0xc0008a008
// 创建指针变量 申明一个指针变量,用于存储变量a的地址
var p1 *int
fmt.Println(p1) // <nil>, 空指针
p1 = &a    // p1指向a的内存地址,
fmt.Println("p1的数值:", p1)
fmt.Printf("p1自己的地址:%p\n", &p1)
fmt.Println("p1的数值,是a的地址,改地址存储的数据", *p1)
// 通过指针,改变变量的数值
*p1 = 200
fmt.Println(a) // 200
// 指针的指针
var p2 **int
fmt.Println(p2)
p2 = &p1
fmt.Printf("%T,%T,%T\n", a,p1,p2)  // int,*int,**int
fmt.Println("p2的数值", p2)  // p1的地址
fmt.Printf("p2自己的地址:%p\n", &p2)  // p2的地址

  • 数组指针和指针数组
    数组指针:首先是一个指针,一个数组的地址
    *[4]Type
    指针数组:首先是一个数组,存储数据类型的是指针
    [4]*Type

    // 1 创建一个普通数组
    arr1 := [4]int{1,2,3,4}
    // 创建一个数组指针
    var p1 *[4]int
    p1 = &arr1
    fmt.Println(p1) //&[1 2 3 4]
    fmt.Printf("%p\n", p1) // 数组arr1的地址
    fmt.Printf("%p\n", &p1) // p1指针自己的地址
    // 3 根据数组指针,操作数组
    (*p1)[0] = 100
    p1[0] = 200  // 简化写法
    fmt.Println(arr1)
    // 4 指针数组
    a :=1
    b :=2
    c :=3
    d :=4
    arr2 := [4]int{a,b,c,d}
    arr3 :=[4]*int{&a,&b,&c,&d}
  • 函数指针指针函数

func main() {
    arr := fun2()
    fmt.Printf("arr1的类型:%T, 地址:%p, 数值:%v\n", arr1, &arr1, arr1)
    arr2 := fun3()
    fmt.Printf("arr2的类型:%T, 地址:%p, 数值:%v\n", arr2, &arr2, arr2)
    fmt.Printf("arr2的指针中存储的数组的地址:%p\n", arr2)
}

func fun3() *[4]int{
    arr :=[4]int{1,2,3,4}
    return &arr
}

func fun2() [4]int{
    arr :=[4]int{1,2,3,4}
    return arr
}
  • 指针作为参数
    arr1 := [4]int{1,2,3,4}
    fun3(arr1)
    fun4(&arr1)
    func fun4(p2 *[4]int) {
    }
    func fun3(arr2 [4]int) {
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!