菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

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

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

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

入驻
28
0

第 10 节:复合类型-5. 指针 -- 指针与指针变量 7. 结构体指针变量

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

7. 结构体指针变量

我们前面定义了指针指向了数组,解决了数组引用传递的问题。那么指针是否可以指向结构体,也能够解决结构体引用传递的问题呢?完全可以。\
下面我们先来看一下,结构体指针变量的定义:\

title

\
也可以使用自动推导类型\
[

title

](https://cdn.lmonkey.com/uploads/images/201...)

现在定义了一个结构体指针变量,那么可以通过该指针变量来操作结构体中的成员项。\

title

\
前面在讲解结构时,用结构体作为函数的参数,默认的是值传递,那么通过结构体指针,可以实现结构体的引用传递。具体实现的方式如下:\
[

title

](https://cdn.lmonkey.com/uploads/images/201...)

package main

import "fmt"

type Person struct {
    id   int
    name string
    sex  string
    age  int
    addr string
}

func main0801() {

    var per Person = Person{101, "张三疯", "男", 180, "武当山"}

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

    //定义指针接收结构体变量地址
    //p := &per
    var p *Person = &per
    //fmt.Printf("%T\n", p) //*Person 类型

    //通过指针间接修改结构体成员的值
    (*p).name = "张君宝"
    //指针可以直接操作结构体成员
    p.age = 140
    p.id = 1000

    fmt.Println(per)
}

//结构体指针作为函数参数
func test4(p *Person) {
    p.addr = "斯塔克公司"
}
func main0802() {
    //结构体指针作为函数参数
    var per Person = Person{101, "钢铁侠", "男", 180, "武当山"}

    //地址传递 形参可以改变实参的值
    test4(&per)

    fmt.Println(per)
}

func main0803() {
    arr := [3]Person{Person{101, "钢铁侠", "男", 180, "斯塔克公司"},
        Person{102, "绿巨人", "男", 38, "实验室"},
        Person{103, "黑寡妇", "女", 23, "前苏联"}}
    //指向结构体数组的指针
    p := &arr

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

    //p[0].age = 40//ok
    (*p)[0].age = 40 //ok

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

}

func main() {
    //map类型变量
    m := make(map[int]*[3]Person)

    //fmt.Printf("%T\n", m)
    m[1] = new([3]Person) //返回值类型为*[3]Person
    m[1] = &[3]Person{Person{101, "钢铁侠", "男", 180, "斯塔克公司"},
        Person{102, "绿巨人", "男", 38, "实验室"},
        Person{103, "黑寡妇", "女", 23, "前苏联"}}

    m[2] = new([3]Person)
    m[2] = &[3]Person{Person{101, "索尔", "男", 180, "斯塔克公司"},
        Person{102, "美队", "男", 38, "实验室"},
        Person{103, "黑豹", "女", 23, "前苏联"}}

    for k, v := range m {
        fmt.Println(k, *v)
    }

    ////数组指针
    //var p *[3]int
    //
    ////创建内存空间存储[3]int
    //
    //p = new([3]int)
    //
    //p[0] = 123
    //p[1] = 222
    //p[2] = 666
    //fmt.Println(p)
}

发表评论

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