首页 > 编程笔记 > C语言笔记 阅读:17

C语言结构体数组定义和使用(非常详细,附带实例)

在 C语言程序中,当要定义 10 个整型变量时,可以使用数组的形式。当要定义 10 个结构体类型变量时,也可以使用数组的形式,这时的数组被称为结构体数组。

结构体数组与普通数组的区别在于,数组中的每个元素都是根据要求定义的结构体类型,而不是基本类型。

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个成员变量,如下表所示。


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

图 1 数组数据在内存中的存储形式

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

程序中,声明 struct goods 结构体类型,同时定义结构体数组 goods,并初始化数据。

定义的数组包含 5 个元素,输出时使用 for 语句进行循环输出操作。其中,定义变量 i 为控制循环操作。因为数组的下标是从 0 开始的,所以为变量 i 赋值为 0。

在 for 语句中,先显示每个学生的输出次序,其中因为 i 的初值为 0,所以要加上 1。之后将数组中的元素所表示的数据输出,这时变量 i 作为数组的下标,然后通过结构体成员的引用得到正确的数据,最后将其输出。

相关文章