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笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。