Cprogramming 简明教程

Nested Structures in C

What is a Nested Structure in C?

结构体中的 structure 称为 nested structure in C 。当结构体类型的某个元素是另一个结构体类型时,我们称之为 C 中的嵌套结构体。当结构体类型的一个元素本身是表示一个或多个类型的复合表示形式时,就会定义嵌套结构体。

Nested Structure Declaration

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

Syntax

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

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

Example

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

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

“学生”变量将按如下方式存储在内存中 −

Name

Age

Course

Kiran

25

001

Accessing Members of a Nested Structure

可以使用 dot (.) operator 访问结构体的成员。对于嵌套结构体,可以有多个结构体级别。因此,您需要为每个结构体级别使用点 (.) 运算符来访问嵌套结构体的成员。

Syntax

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

level1.level2.member_name;

此处,level1 表示外部(父)结构体的结构体变量,level2 表示内部(子)结构体的结构体变量。

Example

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

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

此处,e1 是外部(level 1)结构体“employee” 的结构体变量,d1 是内部(level 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);

结构的嵌套可以用两种不同的方式执行 −

  1. Defining an inline structure

  2. 包括已经定义的结构元素

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

Nested Structure by Defining Inline Structure

在此方法中,我们将定义“employee”数据类型,其中一个元素是“出生日期”。C 没有“date”的内置类型。我们将在“employee”结构中声明带有三个“int”类型“d”、“m”和“y”的“dob”结构,其变量“d1”是外部类型之一。

Example

请看以下示例:

#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”元素进行了初始化。

Nested Structure by Defining Separate Structure

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

在此,“dob”类型在开头定义;它有三个“int”元素 − dmy 。“employee”结构类型在之后定义。

Example 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};

Example 2

在下面的代码中,结构的嵌套达到两个级别。换句话说,外部结构类型“employee”有一个元素是经验结构类型的变量。反过来,经验结构有另一个称为“date”的结构类型的两个元素。

因此,“employee”变量的内存分配可以通过以下示例说明:

Name

Salary

Designation

from

to

Kiran

25000

Clerk

12

5

以下是完整代码——

#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

Pointer to Nested Structure

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

对于嵌套结构,内部结构元素的元素通过“ptr → inner_struct_var.element;”来访问

Example

在此示例中,我们已将指针 ptr 声明为指向 employee 结构变量。内部 dob 结构变量的日期、月份和年份元素分别访问为“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