4.4 KiB
C 语言中的嵌套结构
原文:https://overiq.com/c-programming-101/nested-structures-in-c/
最后更新于 2020 年 7 月 27 日
一个结构可以嵌套在另一个结构中。换句话说,结构的成员可以是任何其他类型,包括结构。下面是创建嵌套结构的语法。
语法:
structure tagname_1
{
member1;
member2;
member3;
...
membern;
structure tagname_2
{
member_1;
member_2;
member_3;
...
member_n;
}, var1
} var2;
**注意:**结构的嵌套可以扩展到任意级别。
为了访问内部结构的成员,我们写一个外部结构的变量名,后面跟一个点(.)运算符,后面跟内部结构的变量,后面跟一个点(.)运算符,然后跟我们要访问的成员的名称。
var2.var1.member_1 -指结构的member_1``tagname_2
var2.var1.member_2-指结构的member_2``tagname_2
以此类推。
让我们举个例子:
struct student
{
struct person
{
char name[20];
int age;
char dob[10];
} p ;
int rollno;
float marks;
} stu;
这里我们把结构人定义为结构学生的一员。下面是我们如何访问人员结构的成员。
stu.p.name -指人的名字
stu.p.age -指人的年龄
stu.p.dob -指人的出生日期
需要注意的是,结构人不是独立存在的。我们不能在程序的任何其他地方声明类型为struct person的结构变量。
而不是在另一个结构中定义该结构。我们可以在外部定义它,然后在我们想要使用它的结构内部声明它是变量。例如:
struct person
{
char name[20];
int age;
char dob[10];
};
我们可以把这个结构作为一个更大结构的一部分。
struct student
{
struct person info;
int rollno;
float marks;
}
这里第一个成员是类型struct person。如果我们使用这种创建嵌套结构的方法,那么在创建其类型的变量之前,您必须首先定义结构。因此,在将人员结构变量用作结构学生的成员之前,您必须首先定义人员结构。
使用这种方法的好处是,现在我们可以在程序的任何其他地方声明一个类型为struct person的变量。
现在允许结构本身嵌套。例如:
struct citizen
{
char name[50];
char address[100];
int age;
int ssn;
struct citizen relative; // invalid
}
初始化嵌套结构
嵌套结构可以在声明时初始化。例如:
struct person
{
char name[20];
int age;
char dob[10];
};
struct student
{
struct person info;
int rollno;
float marks[10];
}
struct student student_1 = {
{"Adam", 25, 1990},
101,
90
};
下面的程序演示了我们如何使用嵌套结构。
#include<stdio.h>
struct person
{
char name[20];
int age;
char dob[10];
};
struct student
{
struct person info;
int roll_no;
float marks;
};
int main()
{
struct student s1;
printf("Details of student: \n\n");
printf("Enter name: ");
scanf("%s", s1.info.name);
printf("Enter age: ");
scanf("%d", &s1.info.age);
printf("Enter dob: ");
scanf("%s", s1.info.dob);
printf("Enter roll no: ");
scanf("%d", &s1.roll_no);
printf("Enter marks: ");
scanf("%f", &s1.marks);
printf("\n*******************************\n\n");
printf("Name: %s\n", s1.info.name);
printf("Age: %d\n", s1.info.age);
printf("DOB: %s\n", s1.info.dob);
printf("Roll no: %d\n", s1.roll_no);
printf("Marks: %.2f\n", s1.marks);
// signal to operating system program ran fine
return 0;
}
预期输出:
Details of student:
Enter name: Phil
Enter age: 27
Enter dob: 23/4/1990
Enter roll no: 78123
Enter marks: 92
*******************************
Name: Phil
Age: 27
DOB: 23/4/1990
Roll no: 78123
Marks: 92.00
工作原理:
在第 3-8 行,我们已经声明了一个名为person的结构。
在第 10-15 行,我们已经声明了另一个名为student的结构,它的一个成员是类型struct student(如上声明)。
在第 19 行,我们已经声明了类型为struct student的变量s1。
接下来的五个scanf()语句(第 23-36 行)要求用户输入学生的详细信息,然后使用printf()(第 40-44 行)语句打印出来。