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

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);

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

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

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

C语言学习笔记---嵌套结构体相关推荐

  1. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  2. c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  3. C语言学习笔记(15)——结构体程序设计

    前言 C语言的基本数据类型有整数型.实数型及字符型,使用这些基本数据类型可以构造数组类型,并且可以定义相关数据类型的指针.本节介绍的结构体类型区别于以上任何数据类型,它还能把各种不同类型的数据组合成一 ...

  4. C语言学习笔记11-结构体(struct、结构作为函数参数、结构数组)、联合体/共用体typedef; union(大、小端序)

    C语言-结构类型 程序中的数据都需要有类型支撑,当数据很复杂时(不是简单的一个值,如时间信息:年月日时分秒6个数据需要作为一个整体),我们需要声明一个新的结构类型来描述这种复合的数据(可以包含很多不同 ...

  5. 结构体学习笔记6——结构体嵌套

    结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...

  6. Go语言学习-- No.11结构体--结构体内嵌

    结构体内嵌 结构体内嵌 结构体内嵌的初始化 结构体内嵌 Go语言的结构体内嵌是一种组合特性,使用结构体内嵌可构建一种面向对象编程思想中的继承关系. 结构体实例化后,可直接访问内嵌结构体的所有成员变量和 ...

  7. C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  8. C++学习笔记25——结构体的定义和使用,结构体数组,结构体指针

    结构体 结构体的基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 结构体的定义和使用 语法:struct 结构体名 {结构体成员列表}: 通过结构体创建变量的方式有三种: stru ...

  9. Swift学习笔记-005结构体和类(疯狂swift讲义第二版)

    1.定义类及类相关的一切 定义类的一般语法 [修饰符] class 类名{ //类的语句 } 定义结构体的一般语法 [修饰符] class 类名{ //结构体的语句 } 定义存储属性的一般语法 [修饰 ...

最新文章

  1. 小程序将form表单数据写入云数据库
  2. 包教包会!7段代码带你玩转Python条件语句(附代码)
  3. 劫起|再谈Linux epoll惊群问题的原因和解决方案
  4. 指定一个actor对pawn不可见
  5. 更加简洁且通用的ViewHolder写法
  6. (转)Awk使用案例总结(运维必会)
  7. NGUI里的sprite和label有白色的边框
  8. boost安装详细教程
  9. javascript_core之正则、Math、Date
  10. 第三章 DirectX 图形绘制(上)
  11. 前端等值线分析DEMO(更新地址)
  12. python+opencv实现图像拼接
  13. Openbravo中文使用手册
  14. OCR营业执照识别助力工商信息智能注册
  15. 中国颅骨固定系统行业市场供需与战略研究报告
  16. 计算机无限办公网络应用与推广论文,无线办公局域网的设计与实施(毕业论文终稿).doc...
  17. win10创建Ubuntu16.04子系统,安装常用软件以及图形界面(包括win10远程桌面连接Ubuntu)
  18. 《Arduino实验》实验二:DHT11温湿度传感器检测当前环境温湿度
  19. 草根SEO如何做好企业网站的优化
  20. 智慧农业物联网—解决方案

热门文章

  1. Dev Treelist使用经验(2)
  2. windows 安装mysql的时候最后执行一直停留在Write configuration file
  3. 图形数据库、NOSQL和Neo4j
  4. Android深入浅出系列之Android开发环境搭建—SDK(三)
  5. Android打开App2SD
  6. Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...
  7. A. 抽象类和抽象方法(abstract)
  8. android Binder机制(一)架构设计
  9. JAVA学习之旅番外篇
  10. 进程环境之命令行参数