构造类型
C语言提供的基本数据类型往往不能满足复杂的程序设计需求,因此C语言允许用户根据自己的需要自定义数据类型,这些自定义的数据类型称为构造类型。构造类型包括数组、枚举、共用体和结构体,下面将针对构造类型进行详细讲解。
1、数组
数组是一组具有相同数据类型的变量集合,这些变量称为数组的元素,数组的类型由数组中存储的元素的类型决定。定义数组时要指定数组类型、数组大小,下面定义几个数组:
int arr[5]; //定义一个int类型的数组,大小为5
char str[10]; //定义一个char类型的数组,大小为10
float ff[10]; //定义一个float类型的数组,大小为10
数组的相关知识将在第6章详细讲解。
2、枚举类型
在日常生活中有许多对象的值是有限的,可以一一列举的。例如一个星期只有周一到周日、一年只有一月到十二月等等。把这些量声明为整型,字符型或其他类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。
枚举类型用于定义值可以被一一列举的变量。枚举类型的声明方式比较特殊,定义枚举类型的关键字为enum,具体格式如下:
enum 枚举名 {标识符1 = 整型常量1, 标识符2 = 整型常量2, ...};
在上述格式中,enum为用于声明枚举类型的关键字,枚举名表示枚举类型的名称。以表示月份的枚举类型为例,声明枚举类型的示例如下:
enum month { JAN=1, FEB=2, MAR=3, APR=4, MAY=5, JUN=6,
JUL=7, AUG=8, SEP=9, OCT=10, NOV=11, DEC=12 };
上述代码声明了一个枚举类型month,enum month枚举类型有12个枚举值,也称为枚举常量,每个枚举值都使用一个整型数值进行标识。定义枚举类型之后,就可以使用此类型定义变量,定义enum month类型的变量,示例代码如下所示:
enum month lastMonth, thisMonth, nextMonth;
上述代码定义了三个enum month类型的枚举变量:lastMonth、thisMonth、nextMonth,这些变量的值必须要从enum month枚举类型中获取,给三个变量赋值,示例代码如下所示:
lastMonth = APR; //给lastMonth赋值为APR
thisMonth = MAY; //给thisMonth赋值为MAY
nextMonth = JUN; //给nextMonth赋值为JUN
需要注意的是,枚举值是常量,不是变量,在程序中不能为其赋值,例如,在程序中对MAR再次赋值是错误的,示例代码如下:
MAR=20; //错误:枚举值MAR是常量,不能赋值
多学一招:枚举类型的快速定义
在定义枚举类型时,如果不给枚举值指定具体的整型数值标识,它会默认该枚举值的整型数值等于前一枚举值的值加1。因此可以将上面enum month枚举类型的定义简化成:
*enum month{JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};*
在上述代码中,FEB、MAR、JUN等的值依次是2、3、4等,如果不指定第一个枚举值JAN对应的常量,则它的默认值是0。
3、共用体
共用体又叫联合体,它可以把不同数据类型的变量整合在一起。共用体数据类型使用union关键字进行声明,其定义格式与类型定义如下代码所示:
union 共用体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
……
数据类型 成员名n;
};
//定义共用体数据类型data
union data
{
int i;
char ch;
};
在上述代码中,左边是声明共用体数据类型的格式,声明共用体数据类型使用uion关键字,其后是共用体类型名称,在“共用体类型名称”下的大括号中,声明了共用体类型的成员项,每个成员由“数据类型”和“成员名”共同组成。
右边声明了一个名为data的共用体类型,该类型由两个不同类型的成员组成。需要注意的是,共用体中的所有成员共用一块内存,在引用共用体变量时,只有一个成员变量是有效的。
声明了共用体类型data,就可以使用data定义具体的变量了。共用体变量的定义有3种方式,分别如下所示:
//先定义共用体类型再定义变量
union data
{
int i;
char ch;
};
union data a, b;
//定义共用体类型的同时定义变量
union data
{
int i;
char ch;
}a, b;
//直接定义共用体类型的变量
union
{
int i;
char ch;
}a, b;
上述展示了三种定义共用体变量a和b的方式,最右边的共用体省略了共用体类型名,直接定义了共用体变量,称为匿名共用体。
定义了共用体变量之后,需要对共用体变量进行初始化,对共用体变量进行初始化时只能对其中一个成员进行初始化。
共用体变量初始化的方式如下所示:
union 共用体类型名 共用体变量={其中一个成员的类型值}
虽然共用体变量初始化时只给一个成员赋值,但是这个成员值必须要使用大括号括起来。下面对data类型的变量a进行初始化,代码如下所示:
union data a={8};
完成了共用体变量的初始化后,就可以引用共用体中的成员了,共用体变量引用其成员使用“.”符号,格式如下所示:
共用体变量.成员名
例如引用变量a中的i成员,则代码如下所示:
a.i
共用体变量可以使用“.”符号引用成员变量,因此在给共用体变量赋值时,也可以使用该方式为具体成员变量赋值,代码如下所示:
a.i=10; //为成员变量i赋值,此时共用体变量a中只有10一个数据
如果连续给多个成员变量赋值,则后面的赋值会覆盖掉前面的赋值,最终共用体变量中只有最后一个成员变量值是有效的。
4、结构体
结构体与共用体类似,它也可以将不同数据类型的变量整合在一起,区别在于,结构体中的所有成员都占有内存,在引用结构体变量时,所有成员都有效。结构体使用关键字struct定义,例如定义存储个人信息的变量,每个人的信息包括姓名、年龄、性别,则需要定义一个结构体来存储这些信息,定义代码如下所示:
struct Person{ //定义结构体类型Person
char name[20]; //使用字符数组存储姓名
int age; //年龄
char sex; //性别
};