首页 > 编程笔记

C语言结构体数组的定义、初始化和使用

数组是一组具有相同数据类型变量的有序集合,可以通过下标获得其中的任意一个元素。结构体类型数组与基本类型数组的定义与引用规则是相同的,区别在于结构体数组中的所有元素均为结构体变量。本文我们介绍C语言结构体数组的定义、初始化以及使用。

C语言结构体数组的定义

结构体数组的定义和结构体变量的定义一样,有以下 3 种方式。

1) 先定义结构体类型,再定义结构体数组。

struct 结构体标识符
{
  数据类型1 成员名1;
  数据类型2 成员名2;
   …
  数据类型n 成员名n;
}; struct 结构体标识符 数组名[ 数组长度];

2) 定义结构体类型的同时,定义结构体数组。

struct 结构体标识符
{
  数据类型1 成员名1;
  数据类型2 成员名2;
   …
  数据类型n 成员名n;
} 数组名[ 数组长度];

3) 不给出结构体类型名,直接定义结构体数组。

struct
{
  数据类型1 成员名1;
  数据类型2 成员名2;
   …
  数据类型n 成员名n;
} 数组名[ 数组长度];

其中,“数组名”为数组名称,遵循变量的命名规则;“数组长度”为数组的长度,要求为大于零的整型常量。例如,定义长度为 10 的 struct student 类型数组 stu[10] 的方法有如下 3 种方式。

【方法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 是一个字符数组名,本身代表的是一个地址值;而其他如整型、字符型等结构体成员,则必须和普通变量一样,在标准输入语句中要加上取地址符号 &

优秀文章