C语言中的嵌套结构体



什么是C语言中的嵌套结构体?

结构体内部的结构体称为**C语言中的嵌套结构体**。当结构体定义中的某个元素是另一个结构体类型时,我们就称之为 C 语言中的嵌套结构体。当结构体类型中的某个元素本身是另一种或多种类型组合的表示时,就会定义嵌套结构体。

嵌套结构体声明

可以通过使用结构体作为另一个结构体的成员来声明嵌套结构体。

语法

嵌套结构体的通用语法如下:

struct struct1{
   type var1;
   type var2;
   struct struct2 strvar;
}

示例

我们可以在以下情况下考虑嵌套结构体。如果我们想定义一个表示“学生”的结构体类型,其中包含“姓名”和“年龄”作为其元素,以及另一个名为“课程”的结构体类型,其特征是“课程 ID”、“标题”和“学分”。这里,“学生”结构体包含一个内部的“课程”结构体。

struct student{
   char *name;
   int age;
   struct course c1;
};

“学生”变量将在内存中存储如下:

姓名 年龄 课程
Kiran 25 001 C编程 6

访问嵌套结构体的成员

可以使用点 (.) 运算符访问结构体的成员。在嵌套结构体的情况下,可能存在多个级别的结构体。因此,您需要对每个级别的结构体使用点 (.) 运算符来访问嵌套结构体的成员。

语法

以下是访问嵌套结构体成员的语法:

level1.level2.member_name;

这里,level1表示外部(父)结构体的结构体变量,而level2表示内部(子)结构体的结构体变量。

示例

考虑以下嵌套结构体定义:

struct employee{
   char name[10];
   float salary;
   struct dob{
      int d, m, y;
   } d1;
}e1;

这里,e1是外部(第 1 级)结构体“employee”的结构体变量,而d1是内部(第 2 级)结构体“dob”的结构体变量。

要访问employee结构体的成员,请使用e1.member_name

printf("Name: %s\n", e1.name);
printf("Salary: %f\n", e1.salary);

要访问dob结构体的成员,请使用e1.d1.member_name

printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y);

嵌套结构体可以通过两种不同的方式执行:

  • 定义内联结构体
  • 包含已定义的结构体的元素

让我们使用合适的示例来学习这些方法。

通过定义内联结构体进行嵌套结构体

在这种方法中,我们将定义一个“员工”数据类型,其元素之一为“出生日期”。C 语言没有内置的“日期”类型。我们将在“员工”结构体内部声明一个包含三个“int”类型“d”、“m”和“y”的“dob”结构体,其变量“d1”是外部类型的元素之一。

示例

请看下面的例子:

#include <stdio.h>
#include <string.h>

struct employee{
   char name[10];
   float salary;
   struct dob{
      int d, m, y;
   } d1;
};

int main(){

   struct employee e1 = {"Kiran", 25000, {12, 5, 1990}};
   printf("Name: %s\n", e1.name);
   printf("Salary: %f\n", e1.salary);
   printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y);
   
   return 0;
}

输出

运行此代码时,将产生以下输出:

Name: Kiran
Salary: 25000.000000
Date of Birth: 12-5-1990

您可以看到“employee”类型的变量初始化时,其“date”元素使用了另一对花括号。

通过定义单独的结构体进行嵌套结构体

使用嵌套结构体的另一种方法是首先定义内部结构体类型,然后使用其变量作为外部结构体类型中的元素之一,该外部结构体类型随后定义。

这里,“dob”类型在开头定义;它有三个“int”元素:dmy。“employee”结构体类型随后定义。

示例 1

由于“dob”已经定义,因此我们可以在“employee”中包含其类型的一个元素。

#include <stdio.h>
#include <string.h>

struct dob{
   int d, m, y;
};

struct employee{
   char name[10];
   float salary;
   struct dob d1;
};

int main(){

   struct employee e1 = {"Kiran", 25000, {12, 5, 1990}};
   printf("Name: %s\n", e1.name);
   printf("Salary: %f\n", e1.salary);
   printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y);
   
   return 0;
}

输出

运行代码并检查其输出:

Name: Kiran
Salary: 25000.000000
Date of Birth: 12-5-1990

请注意,内部结构体类型应在外部类型之前定义。我们还可以声明“dob”类型的变量,然后将其包含在“employee”类型变量的初始化中,如下所示:

struct dob d1 = {12, 5, 1990};
struct employee e1 = {"Kiran", 25000, d1};

示例 2

在以下代码中,结构体的嵌套达到了两级。换句话说,外部结构体类型“employee”有一个元素,它是“experience”结构体类型的一个变量。反过来,“experience”结构体有两个元素,它们是另一个名为“date”的结构体类型。

因此,可以根据以下图示理解“employee”变量的内存分配:

姓名 薪资 职位
Kiran 25000 职员 12 5 1990 31 3 2021

以下是完整代码:

#include <stdio.h>
#include <string.h>

struct date{
   int d, m, y;
};

struct experience{
   char designation[10];
   struct date from;
   struct date to;
};

struct employee{
   char name[10];
   float salary;
   struct experience exp;
};

int main(){

   struct date d1 = {12, 5, 1990};
   struct date d2 = {31, 3, 2021};
   struct experience exp = {"Clerk", d1, d2};
   struct employee e1 = {"Kiran", 25000, exp};

   printf("Name: %s\n", e1.name);
   printf("Salary: %f\n", e1.salary);
   printf("Experience: Designation: %s\n", e1.exp.designation);
   printf("From:  %d-%d-%d\n", e1.exp.from.d,e1.exp.from.m, e1.exp.from.y);
   printf("To: %d-%d-%d\n", e1.exp.to.d, e1.exp.to.m, e1.exp.to.y );

   return 0;
}

输出

运行此代码时,将产生以下输出:

Name: Kiran
Salary: 25000.000000
Experience: Designation: Clerk
From:  12-5-1990
To: 31-3-2021

指向嵌套结构体的指针

我们知道,结构体变量的地址可以存储在指针变量中。此外,C 语言使用间接运算符 (→) 来访问指针引用的变量的元素。

在嵌套结构体的情况下,内部结构体元素的元素通过“ptr → inner_struct_var.element;”访问。

示例

在此示例中,我们声明了一个指向 employee 结构体变量的指针 ptr。内部 dob 结构体变量的 date、month 和 year 元素分别通过“ptr -> d1.d”、“ptr -> d1.m”和“ptr -> d1.y”表达式访问。

#include <stdio.h>
#include <string.h>

struct employee{
   char name[10];
   float salary;
   struct dob{
      int d, m, y;
   } d1;
};

int main(){

   struct employee e1 = {"Kiran", 25000, {12, 5, 1990}};
   struct employee *ptr = &e1;

   printf("Name: %s\n", ptr -> name);
   printf("Salary: %f\n", ptr -> salary);
   printf("Date of Birth: %d-%d-%d\n", ptr -> d1.d, ptr -> d1.m, ptr -> d1.y);

   return 0;
}

输出

运行此代码时,将产生以下输出:

Name: Kiran
Salary: 25000.000000
Date of Birth: 12-5-1990
广告