C语言教程:结构体与联合体

5.1 结构体的定义与使用

1. 结构体的定义

在C语言中,结构体(struct)是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起。结构体可以包含基本数据类型、数组、指针,甚至其他结构体。结构体的定义使用struct关键字。

1.1 结构体的基本语法

struct StructName {
    dataType member1;
    dataType member2;
    // ...
};

1.2 示例代码

#include <stdio.h>

// 定义一个结构体表示学生信息
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // 创建一个结构体变量
    struct Student student1;

    // 为结构体成员赋值
    snprintf(student1.name, sizeof(student1.name), "Alice");
    student1.age = 20;
    student1.gpa = 3.8;

    // 输出结构体成员
    printf("Name: %s\n", student1.name);
    printf("Age: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

2. 结构体的优点

  • 数据封装:结构体允许将相关的数据组合在一起,便于管理和传递。
  • 可读性:使用结构体可以提高代码的可读性,使数据的含义更加明确。
  • 灵活性:结构体可以包含多种数据类型,适用于复杂数据的表示。

3. 结构体的缺点

  • 内存占用:结构体的大小是其所有成员大小的总和,可能导致内存占用较大。
  • 访问复杂性:访问结构体成员需要使用点运算符(.),在某些情况下可能会增加代码的复杂性。

4. 结构体的使用

4.1 结构体的初始化

结构体可以在定义时进行初始化。

struct Student student2 = {"Bob", 22, 3.5};

4.2 结构体数组

可以创建结构体的数组,以存储多个相同类型的结构体。

struct Student students[3] = {
    {"Alice", 20, 3.8},
    {"Bob", 22, 3.5},
    {"Charlie", 21, 3.9}
};

4.3 结构体作为函数参数

结构体可以作为函数参数传递,支持按值传递和按引用传递(使用指针)。

void printStudent(struct Student s) {
    printf("Name: %s, Age: %d, GPA: %.2f\n", s.name, s.age, s.gpa);
}

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

4.4 结构体指针

使用指针可以更高效地传递结构体,避免复制整个结构体。

void updateGPA(struct Student *s, float newGPA) {
    s->gpa = newGPA; // 使用箭头运算符访问结构体成员
}

int main() {
    struct Student student1 = {"Alice", 20, 3.8};
    updateGPA(&student1, 3.9);
    printf("Updated GPA: %.2f\n", student1.gpa);
    return 0;
}

5. 注意事项

  • 内存对齐:结构体的成员可能会因为内存对齐而导致内存浪费。可以使用#pragma pack指令来控制结构体的对齐方式。
  • 嵌套结构体:结构体可以包含其他结构体,使用时需要注意成员的访问。
struct Address {
    char street[100];
    char city[50];
};

struct Student {
    char name[50];
    int age;
    struct Address address; // 嵌套结构体
};
  • 结构体的大小:使用sizeof运算符可以获取结构体的大小,注意结构体的大小可能会受到内存对齐的影响。
printf("Size of Student: %zu\n", sizeof(struct Student));

6. 总结

结构体是C语言中非常重要的特性,它提供了一种将不同类型的数据组合在一起的方式。通过合理使用结构体,可以提高代码的可读性和可维护性。在使用结构体时,需要注意内存管理和数据访问的方式,以确保程序的高效性和稳定性。