联合与结构的异同
联合与结构都是由多个成员分量组成的一个整体
联合与结构在定义、说明和使用(成员引用、指针)上十分相似
结构:多个成员分量分别占用不同的存储空间构成一个整体,成员分量之间是相互独立的,所进行的各种操作互不影响
联合:多个成员分量共同占用同一存储空间,成员分量之间是相互联系的,所进行的操作相互影响
联合的定义
和结构相似,不过关键字为union
union 联合类型名 {
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}
联合类型占用内存
联合类型的变量占用内存空间大小等于成员分量中最长的成员分量所占用内存的长度
联合的特点
1.同一个内存段可以用来存放几种不同类型的成员,但在每一个瞬时只能存放其中一种,而不是同时存放几种。
2.联合变量中起作用的成员是最后一次存放的成员,在存入新的成员后原有的成员就失去作用。
3.联合变量的地址和它的各个成员的地址都是同一地址
4.不能对联合变量名赋值,也不能用联合变量名赋值给其他值,也不能在定义联合变量时对它初始化,这点和结构差别很大
5.不能把联合变量作为函数参数,也不能作为函数结果返回,但可以使用指向联合变量的指针(与结构体变量用法相同)
6.联合可以作为结构的成员,结构也可以作为联合的成员,联合可定义联合数组
联合就像一个泛型
自定义类型typedef
typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型,主要有利于程序的通用和移植
typedef语法
typedef 已定义的类型 新的类型
typedef int INTEGER;
typedef float REAL;
int i;等价于INTEGER i;
float pai;等价于REAL pai;
//声明NUM为整形数组类型
typedef int NUM[100];
NUM data;
// 声明STRING为字符指针类型
typedef char *STRING;
STRING name;
// 声明POINTER为指向函数的指针类型
typedef int (*POINTER)()
POINTER fun;
typedef和#define的区别
#define是在预编译时处理的,它只能作简单的字符串替换
typedef是在编译时处理的,实际上它并不是简单的字符串替换,而是如同定义变量的方法那样声明一个类型
枚举
如果一个变量只有几种可能的值,可以定义为枚举类型。
所谓枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内,这样可以减少程序运行中一些值的错误
定义格式
enum 类型名 {数据列表};
在C编译中,对枚举元素按常量处理,所以称枚举常量。它们不是变量,不能对它们赋值
枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,1,2...,也可以改变枚举元素的值
// 定义的tue以后顺序加1,直到sat值为6
enum weekday {sum=7, mon=1, tue, wed, thu, fri, sat} workday, week-end;
枚举变量的赋值
workday = 2; // 错误
wordday = (enum weekday)2;
枚举变量判断比较
if (workday == mon){...}
if (workday > sum){...}