一、结构体类型的定义
结构体是一种新数据类型,属构造类型,它由若干类型各异的“成员”组成;描述这些“成员”可以使用任何基本数据类型,甚至是另外一种构造数据类型都行。
其实,从本书开篇,就在定义变量,下边的语句我们已经习以为常了:
int i;
我们用整数类型去定义了一个变量 i ,之所以能这样,是因为 int 类型是基本类型, C 语言系统已经定义好了的。而结构类型是程序员自己定义的,是对 C 语言基本数据类型的扩充,可以理解为是程序员发明的,所以“要定义结构类型的变量,必须先定义结构类型本身”就顺理成章了。
区别结构体名、结构变量名,掌握通过结构变量访问其成员的方法是学好本章的关键。
打个比方,我们定义一种结构类型( person )描述青年,青年由几个基本属性(即成员)决定( name , color , sex , age 等),显然描述这些属性只需要用到基本数据类型就够了。我们可以用这个结构类型 person 去定义一个具体的青年人 zhangshan , zhangshan 则称为结构变量名。如果有 100 个青年人组成了班,那么我们可以把他们定义为一个数组 class_one[100] ,该数组称为结构数组。
每一种具有不同成员的结构体就是一个新的数据类型,所以,在说明和使用结构体之前必须作结构类型的定义。定义结构类型使用关键字“ struct ”。
下边几行定义结构类型 person ,并用该类型定义结构变量 zhangshan 和结构数组 class_one[100] :
struct person
{
char name[20]; /* 定义姓名 */
char color[10]; /* 定义肤色 */
char sex[2]; /* 定义性别 */
int age; /* 定义年龄 */
}; /* 注意这里有分号 */
struct person zhangshan, class_one[100];
现在,再定义一个商品结构类型 goods ,设商品包含属性有:商品名、商品代码、厂商、单价、质量。把相同类型的成员定义在一行, goods 可定义如下:
struct goods
{
char goodsname[15], goodcode[15], companyname[30] ;
float price, weight ;
} ;
struct 是结构体的关键字, goods 是结构体名,花括号内的所有变量是这个结构体的成员。这种写法虽然节省了程序行,但降低了可读性,故不建议初学者这样写。
综上,结构体类型简称为结构类型,其定义格式为:
struct < 结构体名 >
{
类型 成员 1;
类型 成员 2;
……
};
二、结构体类型变量的定义
结构体变量简称为结构变量,它由结构类型定义,有三种定义方法。下面以定义结构类型 book 和结构变量 mybook 、 storybook 为例说明之。
1. 先定义结构类型,再定义结构变量。
struct book /* 定义结构体类型 */
{
char bookname[20];
float price;
char publisher[20];
char author[10];
} ;
struct book mybook, storybook;
用这种方法定义结构变量,是最常用的方法,但须注意不能省略关键字“ struct ”。还可以在定义结构变量的同时给它的成员赋初值。如:
struct book /* 定义结构体类型 */
{
char bookname[20];
float price;
char publisher[20];
char author[10];
} ;
struct book mybook = { “maths”, 24.7, “ 电子社 ”, “zhao” }, storybook;
则, mybook 变量的 price = 24.7 。
2. 定义结构类型的同时定义结构变量。
struct book /* 定义结构体类型 */
{
char bookname[20];
float price;
char publisher[20];
char author[10];
} struct book mybook, storybook;
3. 不定义结构类型,直接定义结构变量。
struct /* 不定义结构类型名 */
{
char bookname[20];
float price;
char publisher[20];
char author[10];
} struct book mybook, storybook;
需要说明的是,当某结构类型的成员又是另外一个结构类型时,称嵌套定义,其定义方法如下:
struct brith_date
{
int month ;
int day ;
int year ;
} ;
struct
{
char name[10] ;
char address[30];
char tel[12];
int age;
struct data birthday;
char sex[3];
} student_01 , employee ;
此例直接定义了 student_01 和 employee 两个变量,但是没有定义此结构体的名字,因此不能再定义与 student_01 和 employee 同类的其它结构变量了!如下行定义是错误的:
truct boy, girl;