第 10 节:复合类型-5. 指针 -- 指针与指针变量 7. 结构体指针变量
7. 结构体指针变量
我们前面定义了指针指向了数组,解决了数组引用传递的问题。那么指针是否可以指向结构体,也能够解决结构体引用传递的问题呢?完全可以。\
下面我们先来看一下,结构体指针变量的定义:\
\
也可以使用自动推导类型\
[
](https://cdn.learnku.com/uploads/images/201...)
现在定义了一个结构体指针变量,那么可以通过该指针变量来操作结构体中的成员项。\
\
前面在讲解结构时,用结构体作为函数的参数,默认的是值传递,那么通过结构体指针,可以实现结构体的引用传递。具体实现的方式如下:\
[
](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 协议》,转载必须注明作者和本文链接