结构体也是保存在我们的内存当中,所以我们也可以定义一个结构体类型的指针指向这个结构体
#include
定义了一个结构体指针,指向了结构体数据
这里需要注意两点
- 结构体是我们新定义的数据类型和int,char,float这些关键字一样只是表示类型,不会占用内存空间,而结构体变量或者结构体数据才是实实在在创建出来的数据,有内存空间,我们可以创建指针指向结构体数据,但是不能指向结构体本身,我们说的 结构体指针 指的是 指向结构体类型数据的指针 而不是指向结构体的指针
- 结构体变量名和数组名不同,数组名本身就代表了数组的地址,而结构体变量名不是,所以指针指向结构体地址需要使用取地址符
得到了结构体指针之后,我们可以使用箭头运算符 -> 从指针指向的结构体当中获取结构体的成员
#include
改变指针指向的结构体数据,就能得到不同的内容
#include
结构体指针也可以作为函数的参数来使用
这里需要注意的是
- 使用结构体变量获取成员使用 . 运算符
- 使用结构体指针获取成员使用 -> 运算符
如果我们不使用结构体变量声明,而通过malloc函数来创建结构体的话,得到的就是指向开辟空间的地址的结构体
#include
malloc创建了一个struct student类型大小的空间,得到一个void类型的指针,我们把这个指针转换为struct student类型,然后这个指针就可以使用结构体的成员了
2 结构体指针和函数结构体指针也可以作为函数的参数和返回值如果我们需要利用函数去修改结构体的内容就可以把结构体的地址当作函数的参数,如果需要得到一个结构体的地址,就可以把结构体作为函数的返回值,一般情况下,把结构体指针作为函数的参数和返回值要比结构体变量更常见
#include
3 结构体指针作为结构体的成员 我们可以把结构体作为另一个结构体的成员
比如说,我们可以定义一个结构体用来表示时间,这个结构体包含了年,月,日三个成员
在学生信息当中,可以用这个结构体来代替学生的生日
#include
这里通过stu1.birthday得到结构体内部的结构体,再通过stu1.birthday.year,得到结构体成员的成员
这里我们发现stu1和stu2居然是同一天出生的,但是我们在保存数据的时候,把2002,2,13这个日期分别在stu1和stu2两个个结构体数据当中保存,同一条数据保存了两次,如果使用指针来处理只保存一次就可以了
#include
这里把struct student 的birthday成员类型改为struct date *,用来保存一个指针,使用stu1.birthday得到这个指针,stu1.birthday->year得到这个指针指向的结构体的数据
这样只需要保存一份birth数据就可以了