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.002.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