结构体嵌套
上次,我们声明了一个结构体类型book,book里的一个成员是date,用来存放书籍的出版日期,对于这个日期,我们可以单独为他声明一个结构体类型date来存放,这样可以明确到年月日
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char title[128];
char author[40];
float price;
struct Date date; // 结构体的嵌套,在Book结构体里面再声明一个结构体date
} book = { // 初始化变量
"<带你学C带你飞>",
"小甲鱼" ,
48.8,
{2017,11,11}, // 另外一个结构体 ,括起来。
"清华大学出版社"
};
int main (void)
{
printf("书名:%s\n",book.title) ;
printf("作者:%s\n",book.author) ;
printf("售价:%.2f\n",book.price) ;
printf("出版日期:%d-%d-%d\n",book.date.year,book.date.month,book.date.day) ; // 必须去到最底层才能访问,逐层深入。
printf("出版社:%s\n",book.publisher) ; // 这里的book前没加&是因为这是个数组
return 0;
}
结构体数组
我们上面讨论的是书籍信息的结构体,如果想要搞成系列的话,那可以使用结构体数组来一次存放,结构体数组跟我们之前学习过的数组概念是一致的,只不过每个数组元素不再是简单的基础类型,而是一个结构体类型的数据,所以每个数组元素都包含该结构体的所有成员。
定义:
第一种方法是在声明结构体的时候进行定义:
struct 结构体名称
{
结构体成员1;
结构体成员2;
结构体成员3;
…….
} 数组名 [长度];
第二种方法是先声明一个结构体类型(比如上面的Book),再用此类型定义一个结构体数组
struct 结构体名称
{
结构体成员1;
结构体成员2;
结构体成员3;
…….
} struct 结构体名称 数组名[长度];
初始化结构体数组
结构体数组在定义时就能进行初始化
struct Book book[3] = {
{"《零基础入门学习Python》","小甲鱼" ,49.5,{2016,11,11},"清华大学出版社"},
{"《零基础入门学习Scratch》","不二如是",49.9,{2017,10,1},"清华大学出版社"},
{"《带你学C带你飞》","小甲鱼",49.9,{2018,11,11},"清华大学出版社"}
};
结构体指针
指针我们都知道,什么都能指,当然也可以指向结构体,指向结构体变量的指针我们称为结构体指针
struct Book *pt // 声明一个指向Book的结构体指针变量pt
pt = &book ; // 将book的地址赋值给指针变量
通过结构体指针访问结构体成员
方法一:(*结构体指针).成员名
方法二:结构体指针 -> 成员名
两种方法完全等价,无论使用哪个都能访问结构体成员