C语言学习笔记---嵌套结构体
结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体。如下面的例子:
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语言学习笔记---嵌套结构体相关推荐
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- C语言学习笔记(15)——结构体程序设计
前言 C语言的基本数据类型有整数型.实数型及字符型,使用这些基本数据类型可以构造数组类型,并且可以定义相关数据类型的指针.本节介绍的结构体类型区别于以上任何数据类型,它还能把各种不同类型的数据组合成一 ...
- C语言学习笔记11-结构体(struct、结构作为函数参数、结构数组)、联合体/共用体typedef; union(大、小端序)
C语言-结构类型 程序中的数据都需要有类型支撑,当数据很复杂时(不是简单的一个值,如时间信息:年月日时分秒6个数据需要作为一个整体),我们需要声明一个新的结构类型来描述这种复合的数据(可以包含很多不同 ...
- 结构体学习笔记6——结构体嵌套
结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...
- Go语言学习-- No.11结构体--结构体内嵌
结构体内嵌 结构体内嵌 结构体内嵌的初始化 结构体内嵌 Go语言的结构体内嵌是一种组合特性,使用结构体内嵌可构建一种面向对象编程思想中的继承关系. 结构体实例化后,可直接访问内嵌结构体的所有成员变量和 ...
- C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...
- C++学习笔记25——结构体的定义和使用,结构体数组,结构体指针
结构体 结构体的基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 结构体的定义和使用 语法:struct 结构体名 {结构体成员列表}: 通过结构体创建变量的方式有三种: stru ...
- Swift学习笔记-005结构体和类(疯狂swift讲义第二版)
1.定义类及类相关的一切 定义类的一般语法 [修饰符] class 类名{ //类的语句 } 定义结构体的一般语法 [修饰符] class 类名{ //结构体的语句 } 定义存储属性的一般语法 [修饰 ...
最新文章
- 小程序将form表单数据写入云数据库
- 包教包会!7段代码带你玩转Python条件语句(附代码)
- 劫起|再谈Linux epoll惊群问题的原因和解决方案
- 指定一个actor对pawn不可见
- 更加简洁且通用的ViewHolder写法
- (转)Awk使用案例总结(运维必会)
- NGUI里的sprite和label有白色的边框
- boost安装详细教程
- javascript_core之正则、Math、Date
- 第三章 DirectX 图形绘制(上)
- 前端等值线分析DEMO(更新地址)
- python+opencv实现图像拼接
- Openbravo中文使用手册
- OCR营业执照识别助力工商信息智能注册
- 中国颅骨固定系统行业市场供需与战略研究报告
- 计算机无限办公网络应用与推广论文,无线办公局域网的设计与实施(毕业论文终稿).doc...
- win10创建Ubuntu16.04子系统,安装常用软件以及图形界面(包括win10远程桌面连接Ubuntu)
- 《Arduino实验》实验二:DHT11温湿度传感器检测当前环境温湿度
- 草根SEO如何做好企业网站的优化
- 智慧农业物联网—解决方案
热门文章
- Dev Treelist使用经验(2)
- windows 安装mysql的时候最后执行一直停留在Write configuration file
- 图形数据库、NOSQL和Neo4j
- Android深入浅出系列之Android开发环境搭建—SDK(三)
- Android打开App2SD
- Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...
- A. 抽象类和抽象方法(abstract)
- android Binder机制(一)架构设计
- JAVA学习之旅番外篇
- 进程环境之命令行参数