章节结构
- 共用体类型
- 什么是共用体类型
- 引用共用体变量的方式
- 共用体类型数据的特点
- 使用枚举类型
- 两种使用方式
- 涉及枚举的几个概念
- 用typedef声明新类型名
- 简单的用一个新的类型名代替原有的类型名
- 命名一个简单的类型名代替复杂的类型表示方法
共用体类型
什么是共用体类型
使用同一段内存单元存放不同类型的变量。
如把一个短整型变量、一个字符型变量和一个实型变量放在同一个地址开始的内存单元中。
这种将几个不同数据类型的变量共享同一段内存的结构,称为共用体类型的结构,因此结构体变量所占的内存长度等于最长的成员的长度
两种方法
- 先声明一个共用体类型,在定义该类型的变量
union 共用体名
{
成员表列
}
union 共用体名 共用体变量名;
- 声明共用体类型的同时定义该类型的变量(此处有两种具体方法)
- 声明时声明共用体名
- 声明时不声明共用体名
// 声明时声明共用体名
union 共用体名
{
成员表列
}变量表列;
//声明时不声明共用体名
union
{
成员表列
}变量表列;
引用共用体变量的方式
只有先定义了共用体变量才能引用它。
但是不能引用共用体变量,只能引用共用体变量的成员
引用方式如下: 共用体变量名.成员名
共用体类型数据的特点
- (1)同一内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中一个成员,而不是同时存放几个
因为在每一瞬时,存储单元只能有为以的内容。
也就是说在共用体变量中只能存有一个值
- (2)可以对共用体变量初始化,但初始化表中只能有一个常量。(原因:参见上一条)
- (3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。
- (4)共用体变量的地址和它的各成员的地址都是同一个地址
- (5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
在C99同类型的共用体变量可以互相赋值
共用体变量名1 =共用体变量名2 //两者为同类型的共用体变量,合法
- (6)以前的C规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针作函数参数。C99允许用共用体变量作为函数参数
- (7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。同样的,结构体也可以出现在共用体类型定义中,数组也可以作为共用体共用体的成员
使用枚举类型
如果一个变量只有几种可能的值,就可以定义为枚举类型。
枚举,就是把可能的值一一列举出来,变量的值只限于列举出来的值得范围内。
两种方式使用
enum [枚举名][枚举元素列表]
-
先声明枚举类型,在定义枚举变量
- 声明枚举类型用enum开头
enum Weeday{sun,mon,tue,wed,thu,fri,sat};
- 用此类型来定义变量
enum Weeday workday,weekend
- 声明枚举类型用enum开头
-
不声明有名字的枚举类型,而直接定义枚举变量(与结构体类似)
enum {sun,mon,tue,wed,thu,fri,sat} workday,weekend
涉及枚举的相关概念
- 枚举类型: enum + 枚举名
- 枚举变量: enum + 枚举名 + 枚举变量名
- 枚举元素(或称为枚举常量)::声明枚举类型时花括号里面的内容
- (1)C编译对枚举类型的枚举元素按常量处理,因此不能对它们赋值
- (2)每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5...。
也可以人为地指定枚举类型元素的数值,在定义枚举类型时显示地指定
enum Weekday{sun =7,mon=1,tue,wed,thu,fri,sat}workday,week_end;
此处指定枚举常量sun值为7;mon为1,以后的顺序加1,sat为6- (3)枚举元素可以用来做判断。
枚举元素的比较规则是按其在初始化时指定的整数来进行比较的。
如果定义时没有认为指定,则按默认规则处理,即第1个枚举元素的值为0,依次加1
if(workday == mon)...
if(workday >sun)...
用typedef声明新类型名
(语法:typedef 原来的类型名 新的类型名
- 习惯上,常把用typedef声明的类型名的第1个字母用大写表示,以便与系统提供的标准类型标识符相区别
- 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型。
可以把所有的typedef名称单独放在一个文件中,然后再需要用到它们的文件中用#include指令
把它们包含到文件中 - 使用typedef名称有利于程序的通用与移植。
typedef VS #define
typdedef 和
#define
的作用一样都是起别名。
- #define是在预编译时处理的,它只能作简单的字符串替换。
- typedef是在编译阶段处理的。它不是简单的替换。而是采用如同定义变量的方法那样先出生成一个类型名,然后去定义变量
使用typedef指定新的类型名来代替已有的类型名。有两种情况
- (1)简单地用一个新的类型名代替原有的类型名
如:type int Integer; //指定Integer为类型名,作用与int相同
- (2)命名一个简单的类型名代替复杂的类型表示方法
- 命名一个新的类型名代表结构体类型
typde struct { int month; int day; int year; }Date 此时新的类型名就是Date Date birthday; //此处定义了一个Date结构体类型的变量birthday
- 命名一个新的类型名代表数组类型
- 命名一个新的类型名代表指针类型
- 命名一个新的类型名代表指向函数的指针类型