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

7. 结构体指针变量

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

title

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

title

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

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

title

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

title

](https://cdn.learnku.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)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海PHP自学中心 付费知识星球:破解面试:程序员的求职导师
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
司机 @ 欣昊玉
文章
273
粉丝
339
喜欢
558
收藏
1106
排名:64
访问:12.2 万
私信
所有博文
社区赞助商