网站公告:
诚信为本:市场永远在变,诚信永远不变。
全国服务热线:020-88889999

TELEPHONE

联系我们 CONTACT US
手机:
13988889999
电话:
020-88889999
邮箱:
@gxczdpf.com
地址:
广东省广州市
新闻动态NEWS
当前位置: 首页 > 新闻动态
C语言结构体数组定义与用法示例,以图书管理系统为例
发布时间:2026-02-17 03:25:56 点击量:

编程之时,于处理批量数据之际,结构体数组为你务必得其要领之厉害工具。它可使你借同一套模板去管理数目众多之对象,不管是图书,抑或是学生,乃至商品,皆变得条理清晰,全方位提高代码之组织效能以及数据处理本事句号。

什么是结构体数组

将自定义结构体类型,当作平常数据类型,以此来创建数组,这便是结构体数组的本质所在。如同整型数组、字符数组那般,此刻你拥有了一个皆由同类型结构体变量所凑成的集合类别。这里面的每个数组项,全然都是一个自个儿各有成员的,完整的结构体变量。

这种数据结构的价值体现于处理现实世界当中的批量实体,比如说在一个大学班级里,存在50名学生,每一个学生都具备学号、姓名、成绩等属性,此时结构体数组能够极为完善地组织这些数据,使得你可以借助循环颇为轻易地遍历以及操作所有学生的信息。

struct 结构体名 数组名[数组大小];

结构体数组的定义语法

定义结构体数组有着两步的操作流程,其一在于先行明确一个结构体的类型,这恰似绘制完成一页图纸那般;其二才能够凭借此类型去进行数组的构建工作。其大体的语法格式呈现为:struct结构体名数组名[数组大小];这一行代码向编译器传达出你打算去创建一片涵盖多个结构体变量的连贯内存区域。

要是你需要对一个公司员工的信息予以管理的话,那么先把struct Employee这个类型给定义出来,它涵盖着工号、姓名以及部门等成员。紧接着经由struct Employee staff[100];这样子就创建了一个能够存放100名员工信息的数组。数组的名称staff所表示的是首地址,而每个元素所占用的是sizeof(struct Employee)字节。

图书管理系统的实际案例

使我们着手去达成一个小型的图书管理系统。最为前头要给Book结构体予以定义,它涵盖标题,是字符数组形式的,还有作者,同样是字符数组形式的,以及出版年份,乃是整型的,另外还有价格,属于浮点型的。随后于主函数这儿创建struct Book library[3];这样的一个数组便能够去存放三本各不相同的书籍的相关信息了。

#include 
#include 
// 定义表示书籍的结构体
struct Book {
    char title[50];
    char author[50];
    int year;
    float price;
};
int main() {
    // 定义一个包含 3 本书的结构体数组
    struct Book library[3];
    // 初始化第一本书的信息
    strcpy(library[0].title, "C 程序设计");
    strcpy(library[0].author, "谭浩强");
    library[0].year = 2012;
    library[0].price = 39.8;
    // 初始化第二本书的信息
    strcpy(library[1].title, "数据结构");
    strcpy(library[1].author, "严蔚敏");
    library[1].year = 2008;
    library[1].price = 35.0;
    // 初始化第三本书的信息
    strcpy(library[2].title, "计算机网络");
    strcpy(library[2].author, "谢希仁");
    library[2].year = 2017;
    library[2].price = 49.0;
    // 打印所有书籍的信息
    for (int i = 0; i < 3; i++) {
        printf("书名:%s\n", library[i].title);
        printf("作者:%s\n", library[i].author);
        printf("出版年份:%d\n", library[i].year);
        printf("价格:%.2f\n\n", library[i].price);
    }
    return 0;
}

在为结构体数组成员进行赋值操作的情形之际,需要予以留意字符串所具备的特殊性,不可以直接运用等号来为字符数组实施赋值的行为,而必须要调用strcpy函数才行,举例来讲像是strcpy(library[0].title"C语言程序设计");然而对于整型和浮点型的成员而言,是能够直接进行赋值的操作的,就像library[0].year = 2021;这样的区别乃缘于C语言之中数组名充当常量指针的特性。

遍历与访问结构体数组

借助循环并搭配数组下标,能够以高效的方式进行每个结构体元素的访问。对于“for(int i = 0;i < 3;i++)”这种形式,它可以具体通过特定代码来实现逐行输出所有书籍的书名,比如“printf("书名:%s\n", library[i].title)”。其中,点运算符在代码里用于实现数组元素与其成员的连接,这种代码结构呈现出清晰易懂的特性。

程序在进入实际运行状态时,会依照顺序逐个输出每一本书的完整信息。从最先的那本被叫做《C语言程序设计》的书,一直到第三本名为《Python入门教程》的书籍,出版年份以及价格都会被精准无误地显示出来。这样一种批量进行处理的方式,相较于去定义三个彼此独立的结构体变量而言,可要显得简洁许多。特别是在数据量达到成百上千的那种情况下,它所具备的优势便会更加显著地体现出来。

结构体数组的高级操作

靠着结构体数组,你能够轻松达成各式各样的数据管理功用,比如说去写一个查找函数,在数组里进行遍历从而找出二零二零年之后出版的书籍,又或者运用冒泡排序算法依照价格对书籍开展排序,甚至是计算全部书籍的平均价格呢,仅仅需要累加价格成员接着除以总数就可以了。

这些操作全都受益于数组具备的那连续存储特性,你能够将结构体数组传递给函数,在函数的内部借助指针去操作所有的数据,举例来说,void sortBooks(struct Book books, int n) 这个函数就能够接收任意大小的图书数组,从而实现通用的排序逻辑,这极大地提高了代码的复用性。

动态内存分配与注意事项

书名:C 程序设计
作者:谭浩强
出版年份:2012
价格:39.80
书名:数据结构
作者:严蔚敏
出版年份:2008
价格:35.00
书名:计算机网络
作者:谢希仁
出版年份:2017
价格:49.00

在实际的开发情形当中,数组的大小常常是无法确定的,处于这种状况的时候,就需要运用malloc来实行动态分配。struct Book这个结构体类型的books,是通过(struct Book)malloc(n * sizeof(struct Book))这样的方式创建出来的;如此这般便已经成功创建了一个它的大小能够发生变化的结构体数组,其中n的值能够由用户进行输入来予以确定,或者通过文件读取的方式来加以决定,以此灵活地适应需求方面所产生的变化。

但是,要是结构体成员之中含有指针,举例来说,使用char *title去替代字符数组,那么就必定得针对每个指针分别去分配内存。在进行释放操作的时候,同样得先去释放成员指针所指向的内存,之后再去释放数组自身,这个顺序绝对不可以出错。一旦忘记释放的话,就会造成内存泄漏的现象,要是重复进行释放的操作,反过来则会致使程序崩溃,对于这些细节,必须要格外谨慎小心。

你于实际项目当中,有没有碰到过因数据结构挑选不太恰当进而致使的代码维护方面的难题呢?欢迎在评论区,把你的经历讲出来,点赞以便让更多开发者能够看到这些具备实用特质的技巧哦!