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

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

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

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

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

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

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

相关文章