C语言结构体数组的定义和使用(非常详细,附带实例)
结构体变量中可以存放一组数据,如果要存储多组数据应怎么办?在程序中同样可以使用数组的形式,这时称数组为结构体数组。
结构体数组与之前介绍的数组的区别就在于,数组中的元素是根据要求定义的结构体类型,而不是基本数据类型。
1) 先定义结构体类型,再定义结构体数组,一般形式如下:
例如,定义 5 个手机基本信息结构体数组,代码如下:
这种定义结构体数组的方式是先定义结构体类型,然后再定义结构体数组,代码如下:
2) 定义结构体类型的同时,定义结构体数组,一般形式如下:
同样定义 5 个手机基本信息结构体数组,代码如下:
同样定义 5 个手机基本信息结构体数组,代码如下:

图 1 数组数据在内存中的存储形式
在定义数组 telephone1 时,也可以不指定数组中的元素个数,这时编译器会根据数组后面的初始化值列表中给出的元素个数来确定数组中的元素个数,例如:
【实例】定义一个汽车结构体并初始化,输出汽车的品牌名和报价。具体代码如下:
结构体数组与之前介绍的数组的区别就在于,数组中的元素是根据要求定义的结构体类型,而不是基本数据类型。
C语言结构体数组的定义
定义结构体数组的方式与定义结构体变量的方式相似,只是将结构体变量替换成数组。定义结构体数组的方式有 3 种。1) 先定义结构体类型,再定义结构体数组,一般形式如下:
struct 结构体名 { 成员列表; }; //定义结构体类型 struct 结构体名 数组名[数组长度]; //定义结构体数组
例如,定义 5 个手机基本信息结构体数组,代码如下:
struct telephone //声明手机基本信息结构体 { char brandName[20]; //品牌名 int price; //官方报价 char screen[20]; //主屏尺寸 char processor[20]; //CPU型号 int battery; //电池容量 }; //定义结构体数组
这种定义结构体数组的方式是先定义结构体类型,然后再定义结构体数组,代码如下:
struct telephone telephone1[5]; /*定义结构体数组*/
2) 定义结构体类型的同时,定义结构体数组,一般形式如下:
struct 结构体名 { 成员列表; }数组名[数组长度]; //定义结构体数组
同样定义 5 个手机基本信息结构体数组,代码如下:
struct { 成员列表; }数组名[数组长度]; //定义结构体数组
同样定义 5 个手机基本信息结构体数组,代码如下:
struct //声明手机基本信息结构体 { char brandName[20]; //品牌名 int price; //官方报价 char screen[20]; //主屏尺寸 char processor[20]; //CPU型号 int battery; //电池容量 } telephone1[5];数组中各数据在内存中的存储是连续的,如下图所示:

图 1 数组数据在内存中的存储形式
C语言结构体数组的初始化
与初始化基本数据类型的数组相同,也可以为结构体数组进行初始化操作。初始化结构体数组的一般形式如下:struct 结构体名 { 成员列表; }数组名={初值列表};例如,对手机信息结构体数组进行初始化操作,代码如下:
struct telephone //声明手机基本信息结构体 { char brandName[20]; //品牌名 int price; //官方报价 char screen[20]; //主屏尺寸 char processor[20]; // CPU型号 int battery; //电池容量 } telephone1[5]={ {"vivo NEX",4998,"6.59英寸","高通 骁龙845",4000}, { "oppo R17",2999,"6.4英寸","高通 骁龙670",3500}, { "华为 Mate 20",3999,"6.53英寸","海思 Kirin 980",4000}, { "小米 MIX 3",3299,"6.33英寸","骁龙845”,3100}, { "iPhone Xr",6499,"6.1英寸","苹果A12",2942}};对数组进行初始化时,最外层的花括号表示所列出的是数组中的元素。因为每一个元素都是结构类型的,所以每一个元素使用花括号标识,其中包含每一个结构体元素的成员数据。
在定义数组 telephone1 时,也可以不指定数组中的元素个数,这时编译器会根据数组后面的初始化值列表中给出的元素个数来确定数组中的元素个数,例如:
telephone1[ ]={...};定义结构体数组时,可以先声明结构体类型,再定义结构体数组。
【实例】定义一个汽车结构体并初始化,输出汽车的品牌名和报价。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> /*包含头文件*/ struct car /*汽车结构体*/ { char cName[20]; /*汽车品牌名*/ int iNumber; /*汽车报价*/ } car[5]={{"宝马",491000},{"大众",80000},{"路虎",1150000},{"五菱",50000},{"一汽",107800}}; int main() /*主函数main()*/ { int i; /*循环控制变量*/ for(i=0;i<5;i++) /*使用for进行循环*/ { printf("NO%d car:\n",i+1); printf("名字是: %s, 最低报价: %d元\n",car[i].cName,car[i].iNumber); /*输出数组中的元素数据*/ printf("\n"); /*换行*/ } return 0; /*程序结束*/ }运行程序,结果为:
NO1 car: 名字是: 宝马, 最低报价: 491000元 NO2 car: 名字是: 大众, 最低报价: 80000元 NO3 car: 名字是: 路虎, 最低报价: 1150000元 NO4 car: 名字是: 五菱, 最低报价: 50000元 NO5 car: 名字是: 一汽, 最低报价: 107800元从该实例代码和运行结果可以看出如下内容:
- 将汽车所需要的信息声明为 struct car 结构体类型,同时定义结构体数组 car,并对其初始化数据。需要注意的是,所给出数据的类型要与结构体中的成员变量的类型相符合。
- 定义的数组包含 5 个元素,使用 for 语句进行循环输出。其中,定义变量 i 为循环控制变量。因为数组的索引是从 0 开始的,所以为变量 i 赋值 0。