C语言编程之结构体和联合体

C语言结构体和联合体

  • 一、结构体 (`struct`)
    • 1、结构体定义
    • 2、使用 `typedef` 简化结构体定义
    • 3、结构体数组
    • 4、结构体指针
  • 二、联合体 (`union`)
    • 1、联合体定义
    • 2、联合体与结构体的比较
    • 3、结构体和联合体嵌套
  • 三、小结

在C语言中,结构体struct)和联合体union)是用于组织和管理多种数据类型的复合数据类型。它们允许在一个变量中存储不同类型的数据。结构体和联合体的主要区别在于内存的分配方式。


一、结构体 (struct)

结构体是一个复合数据类型,用于将不同类型的数据组合在一起。每个组成部分称为结构体的成员。结构体为每个成员分配独立的内存空间。

1、结构体定义

定义结构体时,需要使用关键字struct,然后指定结构体的成员。

示例代码:定义和使用结构体

#include 
#include 

// 定义结构体
struct Student {
    int id;                // 学号
    char name[50];         // 姓名
    float gpa;             // 平均绩点
};

int main() {
    struct Student student1;               // 声明结构体变量
    student1.id = 1001;                    // 赋值
    strcpy(student1.name, "Alice");        // 赋值(字符串用strcpy)
    student1.gpa = 3.8;

    printf("学号: %d\n", student1.id);
    printf("姓名: %s\n", student1.name);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

说明

  • struct Student:定义一个名为Student的结构体类型。
  • student1:使用定义的结构体类型创建一个变量。
  • 结构体成员使用点运算符(.)访问,例如student1.idstudent1.name

2、使用 typedef 简化结构体定义

使用typedef关键字可以简化结构体类型的声明,使得结构体变量的定义更加简洁。

#include 
#include 

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

int main() {
    Student student1;                       // 直接使用结构体名定义变量
    student1.id = 1001;
    strcpy(student1.name, "Alice");
    student1.gpa = 3.8;

    printf("学号: %d\n", student1.id);
    printf("姓名: %s\n", student1.name);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

3、结构体数组

可以定义一个包含多个结构体元素的数组,适合存储多个相同类型的复合数据(例如一组学生信息)。

示例代码:结构体数组

#include 
#include 

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

int main() {
    Student students[2];                      // 定义结构体数组

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

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

    for (int i = 0; i < 2; i++) {
        printf("学生 %d:\n", i + 1);
        printf(" 学号: %d\n", students[i].id);
        printf(" 姓名: %s\n", students[i].name);
        printf(" GPA: %.2f\n", students[i].gpa);
    }

    return 0;
}

4、结构体指针

可以使用结构体指针来高效地访问和修改结构体数据。通过结构体指针访问成员时,使用箭头运算符(->)。

示例代码:结构体指针

#include 
#include 

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

int main() {
    Student student = {1001, "Alice", 3.8};
    Student *ptr = &student;                 // 定义指向结构体的指针

    printf("学号: %d\n", ptr->id);           // 使用箭头运算符访问成员
    printf("姓名: %s\n", ptr->name);
    printf("GPA: %.2f\n", ptr->gpa);

    return 0;
}

二、联合体 (union)

联合体与结构体相似,但其所有成员共享同一块内存,因此一个联合体变量的大小等于其最大成员的大小。联合体的一个典型用途是实现类型转换或存储多个可能的值。

1、联合体定义

示例代码:定义和使用联合体

#include 

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

int main() {
    union Data data;

    data.i = 10;
    printf("整数: %d\n", data.i);

    data.f = 220.5;
    printf("浮点数: %.2f\n", data.f);

    strcpy(data.str, "Hello");
    printf("字符串: %s\n", data.str);

    return 0;
}

说明

  • 联合体的所有成员共用一块内存,因此赋值data.f = 220.5后,data.i的值会受到影响。
  • 每次只能使用一个成员,否则会产生数据冲突。

2、联合体与结构体的比较

特性 结构体 (struct) 联合体 (union)
内存分配 每个成员独立分配内存 所有成员共享同一块内存
使用场景 适合存储多种不同类型的数据 适合存储多种可能的数据类型
数据安全 各成员间相互独立,不会互相影响 成员间相互影响,赋值一个影响所有

3、结构体和联合体嵌套

结构体和联合体可以嵌套使用,来创建更复杂的数据结构。

示例代码:结构体嵌套联合体

#include 
#include 

typedef struct {
    int id;
    char name[50];
    union {
        float gpa;
        char grade[2];
    } performance;
} Student;

int main() {
    Student student1;
    student1.id = 1001;
    strcpy(student1.name, "Alice");
    student1.performance.gpa = 3.8;        // 使用GPA

    Student student2;
    student2.id = 1002;
    strcpy(student2.name, "Bob");
    strcpy(student2.performance.grade, "A"); // 使用等级

    printf("学生1: %s, GPA: %.2f\n", student1.name, student1.performance.gpa);
    printf("学生2: %s, 等级: %s\n", student2.name, student2.performance.grade);

    return 0;
}

说明

  • 嵌套的联合体performance允许在Student结构体中储存多种类型的成绩信息。
  • 根据实际需求可以在不同情况下使用performance.gpaperformance.grade

三、小结

结构体和联合体是C语言中强大的复合数据类型,用于管理复杂的数据结构。结构体适用于存储多个独立数据,而联合体则适合用于节省内存并在同一位置存储不同类型的数据。

你可能感兴趣的:(C/C++学习笔记,c语言,算法,数据结构,开发语言,笔记,学习,改行学it)