用户自定义类型
为了表示实际应用中的数据,C提供了如下数据类型
int char float double …
但是,一些复杂的数据(如家谱、地图等)无法用基本数据类型方便地加以描述。
为了应对这种状况,C允许程序员根据需要自定义数据类型,以表示遇到的复杂数据。程序员定义的数据类型统称为用户自定义类型(user-defined type,UDT)。
常见的UDT包括结构体(structure)类型、共用体(union)类型、枚举(enumeration)类型等。
结构体概述
为了描述含有多个字段的记录,C允许自定义结构体类型,定义结构体类型的一般形式为:
struct 结构体名
{
类型 成员名1;
类型 成员名2;
…
类型 成员名n;
};
其中,struct是C的关键字,是structure的缩写,在定义时必不可少;另一个必不可少的是最后的分号。
结构体变量的定义
虽然结构体类型是程序员自定义的数据类型,但是,一旦定义完毕,它与int、float等基本数据类型地位相同。
因此,可以用结构体类型来定义变量,这种变量称为结构体变量。
struct student
{
int num;
char name[10];
char sex;
float height;
};
struct student s1, s2;
可按三种方式定义结构体变量:
结构体变量的初始化
struct student
{
int num;
char name[10];
char sex;
float height;
};
struct student s={99001, "李明", 'M', 1.75};
结构体变量的引用
可以按照形式: 结构体变量名.成员
来引用每个成员,其中“.”称为成员运算符,它的优先级最高
关于结构体变量再强调以下几点:
1、两个同类型结构体变量可直接进行赋值运算。
2、不能将结构体变量作为一个整体进行输入或输出
3、在定义结构体类型时,其成员的类型可以是某结构体类型
4、可以使用结构体变量的成员的地址
5、sizeof( )运算符
该运算符的功能是计算某类型数据在内存中存储时所占 存储单元的大小(字节数)。其格式为:
sizeof(数据类型) 或者 sizeof(数据)
结构体数组
一般地,可以按照
数组名[下标].成员
来引用结构体数组元素的成员
另外,在定义结构体数组时,还可以对其进行初始化。
指向结构体变量的指针
由于“.” 的优先级高于 “*”,所以上式中括号不能少。为了书写简便起见,C引入了指向运算符“->”,(*p).num可表示为p->num
一般地,若p指向某结构体变量,则可以用三种方法引用该结构体的成员:
1、结构体变量 . 成员名
s1.num=99011;
2、(*p) . 成员名
(*p).num=99011;
3、p ->成员名
p->num=99011;
结构体数据作为函数参数
与其他数据类型一样,结构体类型的变量、指针以及数组名也可作为函数参数,进而把结构体数据传递给被调函数。
实际上,主调函数向被调函数传递结构体数据主要有以下两种方式:
除了用前述方法定义新的数据类型(如结构体类型)外,C还允许用typedef为已有数据类型起别名。
typedef 已有类型 新类型名;
共用体类型
定义共用体类型的一般形式为:
union 共用体名
定义共用体变量的一般形式为:
union 共用体名 变量1, 变量2, …, 变量m;
不难发现,“共用体”与“结构体”的定义形式相似,但它们的含义是不同的。