学科分类
目录
C语言

构造类型

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是常量,不能赋值

image-20200519143620604多学一招:枚举类型的快速定义

在定义枚举类型时,如果不给枚举值指定具体的整型数值标识,它会默认该枚举值的整型数值等于前一枚举值的值加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;            //性别
};
点击此处
隐藏目录