STLG_01_11_程序设计C语言 - 结构体

发布于:2025-02-10 ⋅ 阅读:(83) ⋅ 点赞:(0)

        在C语言中,结构体struct)是一种用户定义的数据类型,它允许将不同类型的数据组合在一起。结构体非常适合用于表示复杂的数据结构,例如记录、对象等。通过结构体,可以将相关的数据字段封装在一起,方便管理和操作。

1. 定义结构体

结构体的定义使用struct关键字,后面跟着结构体的名称和一组花括号{},花括号内部包含结构体的成员变量。每个成员变量可以是不同的数据类型。

struct Student {
    char name[50];      // 学生姓名
    int age;            // 学生年龄
    float gpa;          // 学生GPA
};

在这个例子中,struct Student定义了一个结构体,包含三个成员:name(字符数组)、age(整数)和gpa(浮点数)。

2. 声明结构体变量

定义结构体后,你可以声明该结构体类型的变量。

struct Student student1;  // 声明一个Student类型的变量

你也可以在定义结构体的同时声明变量:

struct Student {
    char name[50];
    int age;
    float gpa;
} student1, student2;  // 在定义结构体的同时声明两个变量

3. 访问结构体成员

使用.操作符来访问结构体变量的成员。

strcpy(student1.name, "Alice");  // 设置学生姓名
student1.age = 20;               // 设置学生年龄
student1.gpa = 3.8;              // 设置学生GPA

4. 结构体的初始化

你可以在声明结构体变量时进行初始化:

struct Student student2 = {"Bob", 22, 3.5};  // 初始化结构体

在这种初始化方式中,成员变量按定义顺序依次赋值。

5. 结构体的嵌套

结构体可以嵌套定义,即一个结构体的成员可以是另一个结构体。

struct Date {
    int year;
    int month;
    int day;
};

struct Person {
    char name[50];
    int age;
    struct Date birthdate;  // 嵌套结构体
};

使用嵌套结构体的示例:

struct Person person1;
person1.name = "Charlie";
person1.age = 30;
person1.birthdate.year = 1993;
person1.birthdate.month = 5;
person1.birthdate.day = 15;

6. 结构体的大小

结构体的大小是其所有成员大小的总和,但要注意内存对齐的问题。编译器可能会在结构体成员之间插入填充字节以优化内存访问效率。

#include <stdio.h>

int main() {
    struct Student {
        char name[50];
        int age;
        float gpa;
    };

    printf("Size of struct Student: %lu bytes\n", sizeof(struct Student));
    return 0;
}

7. 结构体指针

你可以使用指向结构体的指针,并通过->操作符访问成员。

struct Student *ptr;
ptr = &student1;

printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
printf("GPA: %.2f\n", ptr->gpa);

8. 结构体数组

你可以定义结构体数组来存储多个结构体实例。

struct Student students[3];  // 定义一个包含3个Student结构体的数组

strcpy(students[0].name, "Alice");
students[0].age = 20;
students[0].gpa = 3.8;

strcpy(students[1].name, "Bob");
students[1].age = 22;
students[1].gpa = 3.5;

strcpy(students[2].name, "Charlie");
students[2].age = 21;
students[2].gpa = 3.7;

9. 结构体与函数

结构体可以作为函数的参数和返回值。

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

struct Student {
    char name[50];
    int age;
    float gpa;
};

// 函数接受结构体作为参数
void printStudent(struct Student s) {
    printf("Name: %s\n", s.name);
    printf("Age: %d\n", s.age);
    printf("GPA: %.2f\n", s.gpa);
}

// 函数返回结构体
struct Student createStudent(char name[], int age, float gpa) {
    struct Student s;
    strcpy(s.name, name);
    s.age = age;
    s.gpa = gpa;
    return s;
}

int main() {
    struct Student student1 = createStudent("Alice", 20, 3.8);
    printStudent(student1);
    return 0;
}

10. 结构体的位域

结构体支持位域操作,允许你定义一个成员占用特定的位数。

struct Flags {
    unsigned int is_enabled : 1;  // 占用1位
    unsigned int mode : 2;        // 占用2位
};

11. 结构体的联合(Union)

联合是一种特殊的数据结构,它允许你存储不同类型的数据,但一次只能存储其中一种。

union Data {
    int i;
    float f;
    char str[20];
};

联合的大小等于其最大成员的大小。

总结

  • 结构体允许你将不同类型的数据组合在一起,适合表示复杂的数据结构。
  • 结构体的成员通过.操作符访问,指针通过->操作符访问。
  • 结构体可以嵌套、作为函数参数、返回值,以及用于数组等。
  • 注意内存对齐问题,结构体的大小可能会大于其成员大小的总和。

网站公告

今日签到

点亮在社区的每一天
去签到