C语言结构体数组定义和使用(非常详细,附带实例)
在 C语言程序中,当要定义 10 个整型变量时,可以使用数组的形式。当要定义 10 个结构体类型变量时,也可以使用数组的形式,这时的数组被称为结构体数组。
结构体数组与普通数组的区别在于,数组中的每个元素都是根据要求定义的结构体类型,而不是基本类型。
例如,定义一个学生信息的结构体数组,其中包含 5 个学生的信息,代码如下:
除此以外,也可以先声明结构体类型再定义结构体数组:
数组中各数据在内存中的存储是连续的,如下图所示:
图 1 数组数据在内存中的存储形式
例如,为学生结构体数组进行初始化操作,代码如下:
定义数组 student 时,也可以不指定数组中的元素个数,这时编译器会根据数组后面的初始化值列表中给出的元素个数,来确定数组中元素的个数。例如:
【实例】某网站“双11”做促销活动,利用结构体数组编写程序,将销量排行前 5 名的商品信息输出。代码如下:
定义的数组包含 5 个元素,输出时使用 for 语句进行循环输出操作。其中,定义变量 i 为控制循环操作。因为数组的下标是从 0 开始的,所以为变量 i 赋值为 0。
在 for 语句中,先显示每个学生的输出次序,其中因为 i 的初值为 0,所以要加上 1。之后将数组中的元素所表示的数据输出,这时变量 i 作为数组的下标,然后通过结构体成员的引用得到正确的数据,最后将其输出。
结构体数组与普通数组的区别在于,数组中的每个元素都是根据要求定义的结构体类型,而不是基本类型。
C语言结构体数组的定义
定义结构体数组的方式与定义结构体变量的方法相同,其一般形式如下:struct 结构体名 { 成员列表; }数组名;
例如,定义一个学生信息的结构体数组,其中包含 5 个学生的信息,代码如下:
struct Student { char cName[20]; /* 姓名 */ int iNumber; /* 学号 */ char cSex; /* 性别 */ int iGrade; /* 年级 */ } student[5]; /* 定义结构体数组 */上述代码中,定义结构体类型的同时定义了结构体数组 student[5]。
除此以外,也可以先声明结构体类型再定义结构体数组:
struct Student student[5]; /* 定义结构体数组 */或者直接定义结构体数组(此时不需要给出结构体名称):
struct { char cName[20]; /* 姓名 */ int iNumber; /* 学号 */ char cSex; /* 性别 */ int iGrade; /* 年级 */ } student[5]; /* 定义结构体数组 */上面的代码都定义了一个结构体数组,其中每个元素都为struct Student类型的数据,每个数据中又有4个成员变量,如下表所示。

数组中各数据在内存中的存储是连续的,如下图所示:

C语言结构体数组的初始化
初始化结构体数组的一般形式如下:struct 结构体名 { 成员列表; }数组名={初始值列表};
例如,为学生结构体数组进行初始化操作,代码如下:
struct Student { char cName[20]; /* 姓名 */ int iNumber; /* 学号 */ char cSex; /* 性别 */ int iGrade; /* 年级 */ } student[5]={{"WangJiaSheng",12062212,'M',3}, {"YuLongjiao",12062213,'W',3}, {"JiangXuehuan",12062214,'W',3}, {"ZhangMeng",12062215,'W',3}, {"HanLiang",12062216,'M',3}}; /* 定义数组并设置初始值 */为数组进行初始化时,最外层的大括号表示列出的是数组中的元素。因为每个元素都是结构体类型,所以也都使用大括号括起来,其中包含每一个结构体元素的成员数据。
定义数组 student 时,也可以不指定数组中的元素个数,这时编译器会根据数组后面的初始化值列表中给出的元素个数,来确定数组中元素的个数。例如:
struct Student student[]={...};同样,也可以先声明结构体数组,后续再进行初始化。
【实例】某网站“双11”做促销活动,利用结构体数组编写程序,将销量排行前 5 名的商品信息输出。代码如下:
#include <stdio.h> struct goods { char cName[20]; /* 品牌名 */ int iNumber; /* 销售量 */ } goods[5]={{"面膜",1458792365}, {"洁面",3256565550}, {"洗发露",3246558540}, {"护发素",2568977412}, {"卸妆膏",155655655}}; /* 定义结构体变量并初始化 */ int main() { int i; for (i = 0; i < 5; i++) /* 循环输出数组中的元素数据 */ { printf("NO%d 产品:\n", i + 1); printf("品牌名: %s, 销量: %d\n", goods[i].cName, goods[i].iNumber); printf("\n"); /* 空格行 */ } return 0; }运行程序,结果为:
NO1 产品:
品牌名: 面膜, 销量: 1458792365
NO2 产品:
品牌名: 洁面, 销量: -1038401746
NO3 产品:
品牌名: 洗发露, 销量: -1048408756
NO4 产品:
品牌名: 护发素, 销量: -1725989884
NO5 产品:
品牌名: 卸妆膏, 销量: 155655655
定义的数组包含 5 个元素,输出时使用 for 语句进行循环输出操作。其中,定义变量 i 为控制循环操作。因为数组的下标是从 0 开始的,所以为变量 i 赋值为 0。
在 for 语句中,先显示每个学生的输出次序,其中因为 i 的初值为 0,所以要加上 1。之后将数组中的元素所表示的数据输出,这时变量 i 作为数组的下标,然后通过结构体成员的引用得到正确的数据,最后将其输出。