共用体(联合体 union)
共用体的基本知识
共用体也是一种C程序员自定义的组合类型.
union 共用体名 { 类型 成员变量1; 类型 成员变量2; .... };
共用体在语法形式和使用上,和结构体是一样的.
引用共用体的对象的成员也是 :
共用体和结构体的区别在哪里呢?
-
(1) 共用体的所有成员变量 共用一块内存
共用体对象所占的内存大小是其最大的那个成员所占的大小.
共用体对象的所有成员变量共用一块内存,共用体所有成员变量的地址都是一样的.
-
(2) 结构体对象所占内存大小是各成员变量所占内存大小之和.
3 枚举
0 一个问题
假如在你的C程序中,需要弄一个变量,来表示星期几? int weekday;//1 2 3 4 5 6 7 weekday = 6; weekday = 7; ... weekday = 250;??
1.枚举
把该类型所有可能的值都列举出来,并且每个值,还有一个名字("字面意思")
枚举也是C程序员自定义的一种类型
enum 枚举名 { 枚举值的名(标识符) };
如 :
enum weekday //新的类型名 { //该类型变量所有可能的值,都在这{}内 MON, TUE, WED, THU, FRI, SAT, SUN }; enum weekday w;//w是一个 类型为 enum weekday 的变量 w = MON; if(w == SUN) { //happy day }//构造了一个新的类型表示几种常用的颜色 enum color { RED; GREEN; BLUE; YELLOW; BLACK; WHITE }; enum color c = YELLOW;
枚举类型在实现时,枚举的值,是用一个整数值表示,如上面的例子 enum weekday
MON 0
TUE 1
WED 2
....
我们在定义枚举类型的时候,也可以指定枚举的值, 如:
enum weekday //新的类型名 { //该类型变量所有可能的值,都在这{}内 MON = 250, TUE,//251 WED, THU, FRI = 600, SAT, //601 SUN };WED的值虽然没有定义,但是会承接上面的自动加一,而到了FRI这里重新定义了,那么又会从新定义的地方开始加一。
因为枚举的类型是通过整数来实现,所有枚举类型的变量都可以++,--等整数参与的运算
如 : enum weekday b = MON; b++;//TUE
typedef
0 一个问题
int a[10];//不仅定义了一个数组a,同时也声明了一个新的类型 "像a这样的类型 int[10] " 定义一个与 a 类型一样的变量 b : //int[10] b int b[10]; typeof(a) b; 有没有办法声明一个 int[10] 这种类型呢?
1 typedef
typedef用来声明(定义) 一个新的类型名
这个类型已经有的,只不过我取一个新的名字.
语法 :
typedef 已经有的类型名 新类型名 ; 新类型名 就等同于 已经有的类型名
例子
typedef int zhengshu ;//整数就是一个新的类型名,他等同与 int int a; zhengshu a; typedef unsigned char uchar typedef char u8 typedef short s16 ....
struct student { int num; char name[32]; //... }; typedef struct student stu_t; stu_t s; ==> typedef struct student { int num; char name[32];//... }stu_t; struct student { int num; char name[32]; //... }stu; //上面定义了一个类型 struct student ,同时定义了一个这个类型的变量 stutypedrf struct { int a; int b; }TEST; //TEST 也是一个类型名 typedef struct node { //... }Node,Node2; //Node,Node2 都是类型名,代表的是 struct node typedef struct node { //... }Node,*pNode; ==> typedef struct node Node typedef struct node* pNode; //Node ,pNode 都是类型名,但是 : // Node <==> struct node // pNode <==> stuct node* pnode 是结构体指针的类型名
typedef一些比较高级的用法
int b;//b是一个变量名 typedef int b;//b是一个类型名 int NUM[100];//NUM是一个数组名 typedef int NUM[100];//NUM 是一个类型名 typedef int[100] NUM; NUM a;//a就是一个数组名,里面含有 100 int类型的元素 void (*p)(int, float);//p是一个函数指针变量 typedef void (*p)(int, float);//p是一个类型名, 函数指针类型 p p1;//p1 就是一个函数指针变量
(ps:这几天的天气变化真的是深刻让我明白了中部地区只有夏天和冬天!!!)