C语言结构体数组的定义、初始化和使用
数组是一组具有相同数据类型变量的有序集合,可以通过下标获得其中的任意一个元素。结构体类型数组与基本类型数组的定义与引用规则是相同的,区别在于结构体数组中的所有元素均为结构体变量。本文我们介绍C语言结构体数组的定义、初始化以及使用。
1) 先定义结构体类型,再定义结构体数组。
【方法1】先定义结构体类型,再定义结构体数组。
说明:在定义数组并同时进行初始化的情况下,可以省略数组的长度,系统会根据初始化数据的多少来确定数组的长度。例如:
【示例1】结构体数据元素的输入输出。要求从键盘输入5名学生的姓名、性别、年龄和分数,输出其中所有女同学的信息。
本例定义了包含 5 个元素的结构体类型的数组,对其中数组元素的成员进行了输入输出操作,程序很简单,但要特别注意其中格式的书写。
例如,在 scanf 语句中,成员 stu[i].name 是不加取地址运算符 & 的,因为 stu[i].name 是一个字符数组名,本身代表的是一个地址值;而其他如整型、字符型等结构体成员,则必须和普通变量一样,在标准输入语句中要加上取地址符号
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
C语言结构体数组的定义
结构体数组的定义和结构体变量的定义一样,有以下 3 种方式。1) 先定义结构体类型,再定义结构体数组。
struct 结构体标识符
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型n 成员名n;
}; struct 结构体标识符 数组名[ 数组长度];
struct 结构体标识符
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型n 成员名n;
} 数组名[ 数组长度];
struct
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型n 成员名n;
} 数组名[ 数组长度];
【方法1】先定义结构体类型,再定义结构体数组。
struct student
{
char name[10];
char sex;
int age;
float score;
};
struct student stu[10];
struct student
{
char name[10];
char sex;
int age;
float score;
};
struct student stu[10];
【方法2】定义结构体类型的同时,定义结构体数组。
struct student
{
char name[10];
char sex;
int age;
float score;
}stu[10];
【方法3】不给出结构体类型名,直接定义结构体数组。
struct
{
char name[10];
char sex;
int age;
float score;
}stu[10];
结构体数组定义好后,系统即为其分配相应的内存空间,数组中的各元素在内存中连续存放,每个数组元素都是结构体类型,分配相应大小的存储空间。例子中的结构体数组 stu[] 在内存中的存放顺序如图所示。

C语言结构体数组的初始化
结构体类型数组的初始化遵循基本数据类型数组的初始化规律,在定义数组的同时,对其中的每一个元素进行初始化。例如:
struct student /* 定义结构体struct student*/
{
char Name[20]; /* 姓名*/
float Math; /* 数学*/
float English; /* 英语*/
float Physical; /* 物理*/
}stu[2]={{"zhang",78,89,95},{"wang",87,79,92}};
在定义结构体类型的同时,定义长度为 2 的结构体数组 stu[2],并分别对每个元素进行初始化。说明:在定义数组并同时进行初始化的情况下,可以省略数组的长度,系统会根据初始化数据的多少来确定数组的长度。例如:
struct key
{
char name[20];
int count;
}key1[ ]={{"break",0},{"case",0},{"void",0}};
系统会自动确认结构体数组 key1 的长度为 3。C语言结构体数组元素的引用
对于数组元素的引用,其实质为简单变量的引用。对结构体类型的数组元素的引用也是一样,其语法形式如下。数组名[数组下标];
[]为下标运算符,数组下标的取值范围为 0,1,2,…,n-1,n 为数组长度。对于结构体数组来说,每一个数组元素都是一个结构体类型的变量,对结构体数组元素的引用遵循对结构体变量的引用规则。【示例1】结构体数据元素的输入输出。要求从键盘输入5名学生的姓名、性别、年龄和分数,输出其中所有女同学的信息。
#include "stdio.h"
int main()
{
struct student /*定义结构体类型*/
{
char name[10];
char sex; /*定义性别,m代表男,f代表女*/
int age;
float score;
}stu[5]; /*定义结构体数组*/
int i;
printf("输入数据:姓名 性别 年龄 分数\n"); /*提示信息*/
/*输入结构体数组各元素的成员值*/
for(i=0;i<5;i++)
scanf("%s %c %d %f",stu[i].name,&stu[i].sex,&stu[i].age,&stu[i].score);
printf("\n输出数据—女同学信息:\n"); /*提示信息*/
printf("--------------------------------------\n");
printf("姓名 年龄 分数\n");
/*输出结构体数组元素的成员值*/
for(i=0;i<5;i++)
if(stu[i].sex=='f')
printf("%s %d %4.1f\n",stu[i].name,stu[i].age,stu[i].score);
}
运行结果:
输入数据:姓名 性别 年龄 分数
wang m 21 90
xiao f 22 78
li m 21 67
zhou m 23 82
qian f 22 100
输出数据—女同学信息:
--------------------------------------
姓名 年龄 分数
xiao 22 78.0
qian 22 100.0
本例定义了包含 5 个元素的结构体类型的数组,对其中数组元素的成员进行了输入输出操作,程序很简单,但要特别注意其中格式的书写。
例如,在 scanf 语句中,成员 stu[i].name 是不加取地址运算符 & 的,因为 stu[i].name 是一个字符数组名,本身代表的是一个地址值;而其他如整型、字符型等结构体成员,则必须和普通变量一样,在标准输入语句中要加上取地址符号
&。声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
ICP备案:
公安联网备案: