立即学习:https://edu.csdn.net/course/play/8088/165751?utm_source=blogtoedu
1. 共用体,又叫联合,把几种不同类型的变量存放到同一段内存单元,这种几个变量共同占同一段内存的结构,就叫共用体
union 共用体名
{
成员列表
}变量列表;
union myuni
{
int carnum; //轿车的编号 , 4个字节
char cartype; //轿车的类型
char cname[60]; //轿车名,60字节
}a,b,c;
结构体与共用体的区别:
结构体变量占的内存是各个成员占的内存长度之和,每个成员分别占用自己的内存单元;
而共用体所占的内存长度等于最长的成员长度。而不是每个成员长度加起来
int ilenunion = sizeof(union myuni); //60而不是65
几点说明:
(1)共用体变量的引用
和结构体很类似:不能直接引用共用体变量,只能引用共用体变量中的成员;
a.cname;a.carnum;
(2)共用体变量的特点
同一段内存存放几种不同类型的成员,但每一个瞬间只能存放其中一种,说白了,每个瞬间只能有一个成员起作用,其他成员不起作用,并不是同时都存在和起作用;
(3)共用体变量地址和其成员的地址都相同:&a,&a.carnum,&a.cartype,&a.cname(这个其实就是a.cname,数组名代表数组首地址,但其实加&也一样);
(4)共用体变量不能在定义的时候初始化:
测试发现union myuni a = {12};也可以。但一般不在定义时初始化
(5)不能把共用体变量作为函数参数,也不能让函数带回共用体变量;
2. 枚举类型
enum color
{
Red, //这叫枚举常量注意逗号分割
Green,
Blue,
Yellow
};
这就定义了一个枚举类型;
enum color mycolor1,mycolor2; //定义了一个枚举类型的变量
说明:
(1)枚举,就是将值一一列举出来,那么上边变量mycolor1,mycolor2的值只限于列举出来的这些值的范围内。
(2)可以直接定义枚举变量,不要枚举名了,那就要直接定义枚举变量才行;
enum {Red,Green,Blue,Yellow} mycolor1,mycolor;
(3)这些Red,Green,Blue,Yellow,这些叫枚举常量,不能手工给他们赋值。
Red = 56; //这不可以
C语言编译器会按照他们定义时的顺序给他们赋值,并且这个赋值是从0开始。就把他们看成整型变量,占4个字节;
则Red其实就等于0,Green=1,Blue=2,Yellow=3;
(4)可以直接给枚举型变量赋值
mycolor1 = Red;
(5)定义枚举类型时,可以改变这里的枚举常量的值
演示:
enum color
{
Red=7,
Green, //后边这个值是前边值+1
Blue=2,
Yellow //后边这个值是前边值+1
};
printf("%d\n",Red); //7
printf("%d\n",Yellow) //8
(6)枚举值,可以理解为整型值;但不能把一个整数直接赋给一个枚举变量:
mycolor1 = 2; //这不可以
但用强制类型转换转是可以的:
mycolor1 = (enum color)2;
(7)枚举值可以赋值给一个整型
int abc = Green;
printf("%d\n",abc); //8
3. 用typedef来定义类型
typedef用来定义新的类型名,来代替已经有的类型名;注意:typedef是用来定义新类型名的,不是用来定义变量的;
typdef语句写法,以定义一个整型数组为例:
第一步:先写出常规的整型数组定义方法:
int n[100];
第二步:将变量名n替换成自己想用的类型名;
int NUM[100];
第三步:在前面加上typedef;
typedef int NUM[100];
这三步完成后,就可以了,此时就可以用这个类型名来定义变量了
NUM n; //定义n为整型数组变量
说明:
(1)习惯上把用typedef定义的类型名用大写字母表示,以便区别于C语言提供的标准类型标识符;
(2)typedef 是用来定义各种类型名的,不能拿来定义变量
(3)typedef只是对有已经存在的类型增加一个类型名,并没有创造新类型
(4)typdef是编译的时候处理的;
可执行文件:编译(预处理(#define,#include,#ifdef),编译(typedef),汇编),链接
(5)typedef最主要的作用是有利于程序的通用性与可移植性。