geekdoc-python-zh/docs/overiq/072.md

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 行)语句打印出来。