C语言学习笔记---嵌套结构体

x33g5p2x  于2021-11-09 转载在 其他  
字(2.3k)|赞(0)|评价(0)|浏览(405)

结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体。如下面的例子:

  1. struct Date{
  2. int year;
  3. int month;
  4. int day;
  5. };
  6. struct book
  7. {
  8. char title[30];
  9. char author[30];
  10. float value;
  11. struct Date date;
  12. };

首先声明一个book结构体,在这个结构体里面描述了书本的标题、作者、价格、出版日期。由于出版日期里面有包含了年月日信息,为了方便管理,就将出版日期也单独定义为一个结构体。这样就相当于在book结构体里面又嵌套了一个日期的结构体。

初始化方法如下:

  1. struct book books[3]= {
  2. {"语文","张三",19.8,{2021,10,1}},
  3. {"数学","李四",21.3,{2021,10,2}},
  4. {"英语","王五",16.8,{2021,10,3}}
  5. };

在这里定义了一个结构体数组,每一个数组元素表示一本书的信息。在初始化的时候,书本的标题、作者、价格按照顺序依次写入,每一项之间用逗号隔开。接下来初始化日期,由于日期也是一个结构体,所以需要用大括号{ }将它括起来,然后在这个大括号里面依次填入日期信息,每一项之间用逗号隔开。初始化的时候也是将两个结构体嵌套起来。
  如果需要访问书本的日期时,就需要用两次点,来定位到具体位置上。比如要访问数学书年的信息,可以使用下面的方法。

  1. books[1].date.year

books[1]首先定位到数学这本书,然后使用 .data 定位到数字书中的日期结构体,接着再使用 .year 定位到日期结构体中的年变量上。这样使用两次点就可定位到第二个结构体里面。如果结构体嵌套了三层,那么访问第三层结构体的时候,就需要用三个点号去定位。

下面使用printf()函数打印这三本书的信息。

  1. 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);
  2. 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);
  3. 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);

输出结果如下:

  由于结构体在声明的时候,也可以不指定结构名,相当于可以声明一个匿名的结构体,那么嵌套结构体的时候,也是可以声明一个嵌套的匿名结构体的。

  1. struct book
  2. {
  3. char title[30];
  4. char author[30];
  5. float value;
  6. struct
  7. {
  8. int year;
  9. int month;
  10. int day;
  11. };
  12. };

在book结构体中嵌套的日期结构体没有具体的名字,是一个匿名的结构体,那么这个匿名结构体里面的对象要如何访问呢?C语言规定,对于匿名结构体里面的对象可以忽略它所在的结构体,直接通过名字访问。比如现在要访问语文书中日期月这个对象的话,可以直接使用下面的代码来访问。

  1. books[1].month

值需要通过一个点加上具体对象名,就可以直接访问到嵌套的结构体里面。这样使用匿名结构体之后,可以使结构体中的对象访问更加的简单。对于嵌套的结构体,初始化方法是不变的。

  1. struct book books[3]=
  2. {
  3. {"语文","张三",19.8,{2021,10,1}},
  4. {"数学","李四",21.3,{2021,10,2}},
  5. {"英语","王五",16.8,{2021,10,3}}
  6. };

初始化方法和上面一样,但是访问具体对象的时候,就简单多了,下面打印这三本书的信息。

  1. 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);
  2. 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);
  3. 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);

访问每本书里面的日期信息时,只需要一个点就可以直接访问,这样代码写起来也会简洁许多。输出结果如下:

  输出结果和为使用匿名结构体的时候也是一样的。

这种嵌套结构体在项目中使用的非常多,在操作系统中也大量的使用了这种嵌套结构体,有时候还会嵌套好多层。

相关文章