跳转到内容

C 语言结构体基础

来自代码酷

C语言结构体基础[编辑 | 编辑源代码]

简介[编辑 | 编辑源代码]

结构体(struct)是C语言中一种重要的复合数据类型,它允许将多个不同类型的变量组合成一个逻辑单元。结构体为程序员提供了一种组织相关数据的有效方式,是构建复杂数据结构的基础。

在C语言中,结构体具有以下特点:

  • 可以包含任意数量的成员变量(称为"字段")
  • 每个成员可以有不同类型
  • 成员在内存中按照声明顺序连续存储(可能有填充字节)
  • 大小等于所有成员大小之和(考虑内存对齐)

基本语法[编辑 | 编辑源代码]

结构体的定义使用struct关键字:

struct 结构体标签 {
    数据类型 成员1;
    数据类型 成员2;
    // 更多成员...
};

例如,定义一个表示二维点的结构体:

struct Point {
    int x;
    int y;
};

声明和使用结构体变量[编辑 | 编辑源代码]

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

// 方式1:先定义结构体类型,再声明变量
struct Point p1;

// 方式2:定义结构体类型的同时声明变量
struct Point {
    int x;
    int y;
} p2, p3;

// 方式3:使用typedef创建别名
typedef struct {
    int x;
    int y;
} Point;
Point p4;

访问结构体成员使用点运算符(.):

p1.x = 10;
p1.y = 20;
printf("Point coordinates: (%d, %d)\n", p1.x, p1.y);

初始化结构体[编辑 | 编辑源代码]

结构体可以在声明时初始化:

// 按成员顺序初始化
struct Point p1 = {10, 20};

// 指定成员初始化(C99及以上)
struct Point p2 = {.x = 30, .y = 40};

// 部分初始化
struct Point p3 = {.y = 50}; // x默认为0

内存布局[编辑 | 编辑源代码]

结构体在内存中的布局可以表示为:

graph LR A[结构体起始地址] --> B[成员1] B --> C[成员2] C --> D[...] D --> E[成员n]

考虑内存对齐时,实际布局可能有填充字节。例如:

struct Example {
    char c;    // 1字节
    int i;     // 4字节(可能在c后有3字节填充)
    double d;  // 8字节
};

实际应用示例[编辑 | 编辑源代码]

学生信息管理系统[编辑 | 编辑源代码]

以下是一个使用结构体管理学生信息的示例:

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

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

void printStudent(Student s) {
    printf("ID: %d\nName: %s\nGPA: %.2f\n", s.id, s.name, s.gpa);
}

int main() {
    Student class[3];
    
    // 初始化学生数组
    class[0] = (Student){101, "Alice", 3.8};
    class[1] = (Student){102, "Bob", 3.5};
    strcpy(class[2].name, "Charlie");
    class[2].id = 103;
    class[2].gpa = 3.9;
    
    // 打印学生信息
    for(int i = 0; i < 3; i++) {
        printStudent(class[i]);
        printf("--------\n");
    }
    
    return 0;
}

输出:

ID: 101
Name: Alice
GPA: 3.80
--------
ID: 102
Name: Bob
GPA: 3.50
--------
ID: 103
Name: Charlie
GPA: 3.90
--------

高级主题[编辑 | 编辑源代码]

结构体嵌套[编辑 | 编辑源代码]

结构体可以包含其他结构体作为成员:

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

typedef struct {
    char name[50];
    Date birthday;
    float salary;
} Employee;

结构体指针[编辑 | 编辑源代码]

可以使用指针访问结构体,此时使用->运算符:

Employee emp = {"John", {15, 7, 1990}, 5000.0};
Employee *ptr = &emp;

printf("Name: %s\n", ptr->name);
printf("Birth year: %d\n", ptr->birthday.year);

结构体大小计算[编辑 | 编辑源代码]

结构体的大小可以使用sizeof运算符获取,但要注意内存对齐的影响:

printf("Size of Employee: %zu bytes\n", sizeof(Employee));

常见问题[编辑 | 编辑源代码]

  • 结构体与数组的区别: 数组包含相同类型的元素,而结构体可以包含不同类型的成员
  • 结构体赋值: C语言允许直接结构体赋值(按值拷贝)
  • 结构体作为函数参数: 可以传值(拷贝整个结构体)或传指针(更高效)

总结[编辑 | 编辑源代码]

结构体是C语言中组织相关数据的强大工具。通过将不同类型的数据组合在一起,结构体使程序更加模块化和易于维护。掌握结构体是学习更高级数据结构如链表、树等的基础。