9.1.8 结构体数组
1. 什么是结构体数组
一个结构体变量中可以存放若干相关的数据。如果有一组或者一批类型相同的结构体数据要处理,显然应该使用结构体作为数组的成员,这就是结构体数组。与一般数组不同的是,结构体数组的每个元素都是结构体类型数据,这些元素又分别包括结构体各个成员。结构体数组和其元素如图9.6所示:
图9.6 结构体数组及元素
2. 定义结构体数组
和普通数组相同,结构体数组也必须先定义,后使用。而定义结构体数组的方法和定义结构体变量的方法相同,区别在于需要说明变量为数组类型即可。其一般形式为:
struct 结构体类型名
{
数据类型名1 成员名1;
… …
数据类型名n 成员名n;
};
struct 结构体类型名 数组变量名列表;
也可以使用类似于其他两种定义结构体变量的方式来定义结构体数组,此处就不再叙述,留给读者去思考。
下面使用第二种方式来定义一个表示一百单八将中的3位女性英雄的数组women:
struct hero
{
int number; //排名
char star_name[20]; //星名
char name[20]; //名称
char nickname[20]; //绰号
char weapon[20]; //使用武器
} women[3];
数组women共有3个元素,其元素类型都为struct hero。而每个数组元素又包含5个成员,如图9.7所示:
图9.7 结构数组women及元素
3. 初始化结构体数组
和C语言中其它类型数组一样,结构体数组定义时也可以初始化。其一般形式为:
struct 结构体类型名
{
数据类型名1 成员名1;
… …
数据类型名n 成员名n;
};
struct 结构体类型名 数组变量名列表 = {初值列表};
或者:
struct [结构体类型名]
{
数据类型名1 成员名1;
… …
数据类型名n 成员名n;
} 数组变量名列表 = {初值列表};
其中,[]中的内容可以省略。
下面就来初始化前面定义的数组women[3]:
women[3]={{59,’W’,”地慧星”,”扈三娘”,”一丈青”,”日月双刀”},
{101,’W’,”地阴星”,”顾大嫂”,”母大虫”,”刀”},
{103,’W’,”地壮星”,”孙二娘”,”母夜叉”,”刀”}};
数组women及其元素如图9.8所示:
图9.8 结构体数组women及元素
4. 不指定元素个数的结构体数组定义
定义结构体数组时,元素个数也可以不指定,但必须在定义时进行初始化。其一般形式为([]中的内容可以省略):
struct [结构体类型名]
{
数据类型名1 成员名1;
… …
数据类型名n 成员名n;
} 数组变量名列表 = {{…},{…},{…},{…}};
或:
struct 结构体类型名
{
数据类型名1 成员名1;
… …
数据类型名n 成员名n;
};
struct 结构体类型名 数组变量名列表 = {{…},{…},{…},{…}};
在编译的时候,系统会根据初始化值的个数自动确定数组元素的个数。可以简单的认为,元素个数为花括号数量(按对计算)减1。
5. 引用结构体数组变量
结构体数组变量的引用一般是指对数组元素成员的引用,和普通变量类似,只不过引用的对象是数组的元素。例如,下面是对women数组元素的正确引用:
women[0].number+1;
printf(“%s”,women[2].nickname);
第一条语句引用结构体数组women的第一个元素的成员number(类型为int)并对其进行加一运算,如果按照本节中对其初始化时的赋值,此表达式的值为60。
第二条语句输出了women的第三个元素的成员nickname,如果按照本节中对其初始化时的赋值,将输出《水浒传》中一个大名鼎鼎的绰号“母夜叉”。
需要注意的是既然引用的对象是数组元素,那么数组下标不能等于或超过数组元素的个数。例如下面的引用是错误的:
women[3].number> 100//数组下标错误
最新作品《C语言参悟之旅》全新上市,敬请关注!
官方网站:http://www.tqbooks.net/product/gb/product_detail.asp?catalogid=10&productid=1474
China-pub有售:http://www.china-pub.com/49980