菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
60
0

第 10 节:复合类型-5. 指针 -- 数组指针与指针数组

原创
05/13 14:22
阅读数 526

3. 数组指针

前面在讲解数组的时候,我们用数组作为函数参数,但是数组作为参数进行传递是值传递,如果想引用传递,可以使用数组指针。具体使用方式如下:

title

\
定义一个数组,作为函数 Swap 的实参进行传递,但是这里传递的是数组的地址,所以 Swap 的形参是数组指针。,\
这时指针 p,指向了数组 a, 对指针 p 的操作实际上是对数组 a 的操作,所以如果直接执行如下语句:fmt.Println (p), 会输出数组 a 中的值。也可以通过 p 结合下标将对应的值取出来进行修改。最终在 main 函数中输出数组 a,发现其元素也已经修改。\
当然,我们也可以通过循环的方式来将数组指针中的数据打印出来:

package main

import "fmt"

func main0501() {

    arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    //定义指针 指向数组  数组指针
    //自动推导类型创建数组指针
    //p := &arr

    //指针和数组建立关系
    var p *[10]int
    p = &arr

    //fmt.Printf("%T\n", p)

    //通过指针间接操作数组

    //fmt.Println(len(p))
    for i := 0; i < len(p); i++ {
        fmt.Println(p[i])
    }
    //(*数组指针变量)[下标]=值
    //(*p)[1] = 222
    //数组指针可以直接操作数组元素
    //p[1] = 222//ok
    //fmt.Println(*p)
}

func main0502() {
    arr := [5]int{1, 2, 3, 4, 5}
    //指针变量和要存储的数据类型要相同

    //p1和p2在内存中指向相同的地址  但是p1和p2的类型不同 一个是指向整个数组   一个是指向数组的元素
    p1 := &arr
    //p2 := &arr[0]

    //fmt.Printf("%p\n", p1)
    //fmt.Printf("%p\n", p2)
    //
    //fmt.Printf("%T\n", p1)
    //fmt.Printf("%T\n", p2)

    for i := 0; i < len(p1); i++ {
        fmt.Println(p1[i])
    }

}

//将数组指针作为函数参数

//func test2(p *[5]int) {
//
//  //通过指针间接操作数组
//  p[2] = 123
//
//}
//将数组指针作为函数参数
func BubbleSort(arr *[10]int) {

    for i := 0; i < len(arr)-1; i++ {
        for j := 0; j < len(arr)-1-i; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
}
func main() {
    arr := [10]int{9, 1, 5, 6, 8, 4, 10, 7, 2, 3}
    //p := &arr
    //地址传递
    //test2(p)

    BubbleSort(&arr)
    fmt.Println(arr)
}

4. 指针数组 -- 不容易懂重点

上一小节,讲解到的是数组指针,也就是让一个指针指向数组 ,然后可以通过该指针来操作数组。还有一个概念叫指针数组,这两个概念很容混淆,指针数组指的是一个数组中存储的都是指针(也就是地址)。也就是一个存储了地址的数组。\
下面通过一个案例,看一下指针数组的应用\

title

package main

import "fmt"

func main0601() {

    //var arr [10]int
    //指针数组  数组元素是指针类型
    a := 10
    b := 20
    c := 30
    var arr [3]*int = [3]*int{&a, &b, &c}

    //fmt.Println(arr)
    //
    //fmt.Println(&a)
    //fmt.Println(&b)
    //fmt.Println(&c)

    //*arr[1] = 200

    //fmt.Println(b)

    for i := 0; i < len(arr); i++ {
        fmt.Println(*arr[i])
    }
}
func main() {
    a := [3]int{1, 2, 3}
    b := [3]int{4, 5, 6}
    c := [3]int{7, 8, 9}

    //p := &a

    //二维数组模型
    var arr [3]*[3]int = [3]*[3]int{&a, &b, &c}

    fmt.Println(arr)
    //fmt.Printf("%T\n", p)

    //for i := 0; i < len(arr); i++ {
    //  //fmt.Println(*arr[i])//[3]int类型
    //  for j := 0; j < len(*arr[i]); j++ {
    //      fmt.Printf("%d ", (*arr[i])[j])
    //  }
    //  fmt.Println()
    //}

    (*arr[1])[1] = 555

    fmt.Println(b)
}

发表评论

0/200
60 点赞
0 评论
收藏
为你推荐 换一批