Skip to content

LV010-结构体数组

具有相同结构体类型的结构体变量也可以组成数组,称它们为 结构体数组。结构体数组的 每一个数组元素都是结构体类型的数据,它们都分别包括各个成员(分量)项。

一、结构体数组的定义

定义结构体数组的方式与定义结构体变量的方式类似。

1. 方式一

  • 先定义结构体数据类型,再定义结构体数组
c
/* 定义结构体数据类型 */
struct STU
{
	char *name;      /* 姓名 */
	char gender;     /* 性别 */
	int age;         /* 年龄 */
	char id[11];     /* 学号 */
	float score;     /* 成绩 */
};                   /* ; 不可缺少 */

/* 定义结构体数组 */
struct STU stu[6];

定义了一个结构体数组 stu ,它有 6 个元素,每个元素都是 Student 结构体类型,每个元素都由 5 个成员组成。

2. 方式二

  • 定义结构体数据类型的同时定义结构体数组
c
/* 定义结构体数据类型同时定义结构体变量 */
struct STU
{
	char *name;      /* 姓名 */
	char gender;     /* 性别 */
	int age;         /* 年龄 */
	char id[11];     /* 学号 */
	float score;     /* 成绩 */
} stu1[6];           /* ; 不可缺少 */

与方式一类似,定义了一个结构体数组 stu ,它有 6 个元素,每个元素都是 Student 结构体类型,每个元素都由 5 个成员组成。如果只需要 stu 一个结构体数组,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名

c
/* 定义结构体数据类型同时定义结构体变量 */
struct               /* 省略结构体名称 */
{
	char *name;      /* 姓名 */
    char gender;     /* 性别 */
    int age;         /* 年龄 */
    char id[11];     /* 学号 */
    float score;     /* 成绩 */
}stu[6];             /* ; 不可缺少 */

二、结构体数组的使用

其实这与变量的赋值也是很类似的。

1. 使用格式

  • 引用结构体变量成员的方式如下:
c
结构体数组名[index].成员名1
结构体数组名[index].成员名2
...
结构体数组名[index].成员名N
  • 对结构体变量成员赋值的方式如下:
c
结构体数组名[index].成员名1 = value1;
结构体数组名[index].成员名2 = value2;
...
结构体数组名[index].成员名N = valueN;

【注意】

(1)访问或者赋值的时候注意遵循数组访问格式,当访问到某个元素后,再对元素的成员进行访问即可。多维数组也是一样。

(2)可以将一个结构体数组元素值赋给 同一结构体类型 的数组中的另一个元素,或者赋给 同一类型 的结构体变量。

(3)我们 不能把结构体数组元素作为一个整体 直接进行输入输出,另外与普通数组一样,需要使用循环遍历整个结构体数组。

2. 赋值与初始化

这里的话直接看实例把,其实没啥说的,就跟一般的数组一样的,注意结构体数据的引用方式即可。有四种方式,其中赋值方式二和赋值方式三也可以称之为结构体数组的初始化。

2.1 赋值方式一

  • 先定义结构体数组,再赋值
c
#include <stdio.h>
#include <string.h>
/* 定义结构体数据类型 */
struct Student
{
	char *name;      /* 姓名 */
    char gender;     /* 性别 */
    int age;         /* 年龄 */
    char id[11];     /* 学号 */
    float score;     /* 成绩 */
};                   /* ; 不可缺少 */

int main(int argc, char *argv[])
{ 
    struct Student stu[3]; /* 定义结构体数组 */
	int i = 0;
    stu[1].name = "qidaink";
    stu[1].gender = 'm';
    stu[1].age = 18;
    strcpy(stu[1].id, "0000000001");
    stu[1].score = 95.8;
    
    for(i = 0; i < sizeof(stu)/sizeof(struct Student); i++)
    {
       printf("i = %d, %s %c %d %s %.2f\n", i, stu[i].name, stu[i].gender, stu[i].age, stu[i].id, stu[i].score);
    }
    
    return 0;
}

在终端执行以下命令:

shell
gcc test.c -Wall # 编译程序 
./a.out          # 执行可执行文件

会看到有如下信息输出:

shell
i = 0, (null)  0         0.00
i = 1, qidaink m 18 0000000001 95.80
i = 2, UH��AWAVAUATSH��(L��!  0 ��JTV 0.00

可以看到,出现了很多乱码,这就是因为数组没有初始化造成的。

2.2 赋值方式二

  • 先定义结构体,然后在定义结构体数组的时候进行赋值
c
/* 语法格式 */
struct 结构体名
{
    数据类型 成员名1;
    数据类型 成员名2;
    ...
    数据类型 成员名N;
};
struct 结构体名 数组名[元素个数] = { 初始数据表 }

示例如下:

c
#include <stdio.h>
#include <string.h>
/* 定义结构体数据类型 */
struct Student
{
	char *name;      /* 姓名 */
    char gender;     /* 性别 */
    int age;         /* 年龄 */
    char id[11];     /* 学号 */
    float score;     /* 成绩 */
};                   /* ; 不可缺少 */

int main(int argc, char *argv[])
{ 
    struct Student stu[3] = {{"qidaink", 'm', 18, "0000000001", 95.8}}; /* 定义结构体变量 */
    int i = 0;
    for(i = 0; i < sizeof(stu)/sizeof(struct Student); i++)
    {
       printf("i = %d, %s %c %d %s %.2f\n", i, stu[i].name, stu[i].gender, stu[i].age, stu[i].id, stu[i].score);
    }

    return 0;
}

在终端执行以下命令:

shell
gcc test.c -Wall # 编译程序 
./a.out          # 执行可执行文件

会看到有如下信息输出:

shell
i = 0, qidaink m 18 0000000001 95.80
i = 1, (null)  0  0.00
i = 2, (null)  0  0.00

2.3 赋值方式三

  • 定义结构体时直接对结构体数组赋值
c
/* 语法格式 */
struct 结构体名
{
    数据类型 成员名1;
    数据类型 成员名2;
    ...
    数据类型 成员名N;
}数组名[元素个数] = { 初始数据表 };

示例如下:

c
#include <stdio.h>
#include <string.h>
/* 定义结构体数据类型 */
struct Student
{
	char *name;      /* 姓名 */
    char gender;     /* 性别 */
    int age;         /* 年龄 */
    char id[11];     /* 学号 */
    float score;     /* 成绩 */
}stu[3] = {{"qidaink", 'm', 18, "0000000001", 95.8}};

int main(int argc, char *argv[])
{  
    int i = 0;
    for(i = 0; i < sizeof(stu)/sizeof(struct Student); i++)
    {
       printf("i = %d, %s %c %d %s %.2f\n", i, stu[i].name, stu[i].gender, stu[i].age, stu[i].id, stu[i].score);
    }

    return 0;
}

在终端执行以下命令:

shell
gcc test.c -Wall # 编译程序 
./a.out          # 执行可执行文件

会看到有如下信息输出:

shell
i = 0, qidaink m 18 0000000001 95.80
i = 1, (null)  0  0.00
i = 2, (null)  0  0.00