结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体。如下面的例子:
struct Date{
int year;
int month;
int day;
};
struct book
{
char title[30];
char author[30];
float value;
struct Date date;
};
首先声明一个book结构体,在这个结构体里面描述了书本的标题、作者、价格、出版日期。由于出版日期里面有包含了年月日信息,为了方便管理,就将出版日期也单独定义为一个结构体。这样就相当于在book结构体里面又嵌套了一个日期的结构体。
初始化方法如下:
struct book books[3]= {
{"语文","张三",19.8,{2021,10,1}},
{"数学","李四",21.3,{2021,10,2}},
{"英语","王五",16.8,{2021,10,3}}
};
在这里定义了一个结构体数组,每一个数组元素表示一本书的信息。在初始化的时候,书本的标题、作者、价格按照顺序依次写入,每一项之间用逗号隔开。接下来初始化日期,由于日期也是一个结构体,所以需要用大括号{ }将它括起来,然后在这个大括号里面依次填入日期信息,每一项之间用逗号隔开。初始化的时候也是将两个结构体嵌套起来。
如果需要访问书本的日期时,就需要用两次点,来定位到具体位置上。比如要访问数学书年的信息,可以使用下面的方法。
books[1].date.year
books[1]首先定位到数学这本书,然后使用 .data 定位到数字书中的日期结构体,接着再使用 .year 定位到日期结构体中的年变量上。这样使用两次点就可定位到第二个结构体里面。如果结构体嵌套了三层,那么访问第三层结构体的时候,就需要用三个点号去定位。
下面使用printf()函数打印这三本书的信息。
printf("%s %s %f %d-%d-%d\r\n",books[0].title,books[0].author,books[0].value,books[0].date.year,books[0].date.month,books[0].date.day);
printf("%s %s %f %d-%d-%d\r\n",books[1].title,books[1].author,books[1].value,books[1].date.year,books[1].date.month,books[1].date.day);
printf("%s %s %f %d-%d-%d\r\n",books[2].title,books[2].author,books[2].value,books[2].date.year,books[2].date.month,books[2].date.day);
输出结果如下:
由于结构体在声明的时候,也可以不指定结构名,相当于可以声明一个匿名的结构体,那么嵌套结构体的时候,也是可以声明一个嵌套的匿名结构体的。
struct book
{
char title[30];
char author[30];
float value;
struct
{
int year;
int month;
int day;
};
};
在book结构体中嵌套的日期结构体没有具体的名字,是一个匿名的结构体,那么这个匿名结构体里面的对象要如何访问呢?C语言规定,对于匿名结构体里面的对象可以忽略它所在的结构体,直接通过名字访问。比如现在要访问语文书中日期月这个对象的话,可以直接使用下面的代码来访问。
books[1].month
值需要通过一个点加上具体对象名,就可以直接访问到嵌套的结构体里面。这样使用匿名结构体之后,可以使结构体中的对象访问更加的简单。对于嵌套的结构体,初始化方法是不变的。
struct book books[3]=
{
{"语文","张三",19.8,{2021,10,1}},
{"数学","李四",21.3,{2021,10,2}},
{"英语","王五",16.8,{2021,10,3}}
};
初始化方法和上面一样,但是访问具体对象的时候,就简单多了,下面打印这三本书的信息。
printf("%s %s %f %d-%d-%d\r\n",books[0].title,books[0].author,books[0].value,books[0].year,books[0].month,books[0].day);
printf("%s %s %f %d-%d-%d\r\n",books[1].title,books[1].author,books[1].value,books[1].year,books[1].month,books[1].day);
printf("%s %s %f %d-%d-%d\r\n",books[2].title,books[2].author,books[2].value,books[2].year,books[2].month,books[2].day);
访问每本书里面的日期信息时,只需要一个点就可以直接访问,这样代码写起来也会简洁许多。输出结果如下:
输出结果和为使用匿名结构体的时候也是一样的。
这种嵌套结构体在项目中使用的非常多,在操作系统中也大量的使用了这种嵌套结构体,有时候还会嵌套好多层。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_20222919/article/details/121155816
内容来源于网络,如有侵权,请联系作者删除!