第十章 结构体与共用体
第三节 共用体,枚举类型,typedef
1. 共用体
-
又叫联合
-
把几种不同类型的变量存放到同一段内存单元(同一个内存地址开始的单元中),几个变量共同占用同一段内存的结构,就叫共用体
-
定义形式:
union 共用体名
{
成员列表
}变量列表
- 实例一
union myuni
{
int carnum;
char cartype;
char cname[60];
}a,b,c;//将共用体定义和变量定义放在一起
- 实例二
union myuni
{
int carnum;
char cartype;
char cname[60];
};
union myuni a, b, c;
- 结构体和共用体是明显不同的,结构体占用的内存是各个成员占用的内存之和,共用体是占用的内存是成员变量中最长的成员长度
#include <iostream>
#include <cstring>
union myuni {
int carnum;
char cartype;
char cname[60];
};
struct mystru {
int carnum;
char cartype;
char cname[60];
};
int main(int argc, char *argv[]) {
printf("struct mystru %d\n", sizeof(mystru));
printf("union myuni %d\n", sizeof(myuni));
return 0;
}
几点说明
-
共用体变量的引用,a.carnum
-
共用体变量的特点:每一个瞬间只能存放其中一种,即只有一个成员存在
#include <iostream>
#include <cstring>
union myuni {
int carnum;
char cartype;
char cname[60];
}a;
struct mystru {
int carnum;
char cartype;
char cname[60];
};
int main(int argc, char *argv[]) {
a.carnum = 123;
strcpy(a.cname, "FF");
printf("a.carnum: %d\n", a.carnum);
printf("a.cname: %s\n", a.cname);
return 0;
}
-
共用体变量地址和其成员变量的地址都一样
-
共用体变量不能在定义的时候初始化,只能给定第一个成员类型
-
不能把共用体变量作为函数参数,也不能让函数返回共用体变量
2. 枚举类型
- 四种颜色: 红, 绿, 蓝, 黄, // Red表示红色, Green表示绿色, Blue表示蓝色, Yellow表示黄色
enum color
{
//枚举常量(当成编号,整型数字)
Red, //0
Green, //1
Blue, //2
Yellow //3
};
enum color mycolor1, mycolor2;//定义了两个枚举变量
- 说明:
a) 枚举:就是将值一一列举出来,那么mycolor1和mycolor2变量的值只限于列出来的这些值的范围内
b) Red, Green, Blue, Yellow都是枚举常量(当成编号,整型数字),不能改变
c) 可以直接给枚举型变量赋值
#include <iostream>
#include <cstring>
enum color {
//枚举常量(当成编号,整型数字)
Red, //0
Green, //1
Blue, //2
Yellow //3
};
int main(int argc, char *argv[]) {
enum color mycolor;
mycolor = Red;
printf("sizeof color: %d\n", sizeof(mycolor));
return 0;
}
d) 定义枚举常量时,可以给枚举常量赋值
#include <iostream>
#include <cstring>
enum color {
//枚举常量(当成编号,整型数字)
Red=-6,
Green, //-7
Blue=8,
Yellow //9
};
int main(int argc, char *argv[]) {
enum color mycolor;
mycolor = Yellow;
printf(" Yellow: %d\n", mycolor);
return 0;
}
-
枚举值就可以理解成整型值, 枚举值也可以赋给整型
-
枚举值可以做比较
#include <iostream>
#include <cstring>
enum color {
//枚举常量(当成编号,整型数字)
Red = -6,
Green, //-7
Blue = 8,
Yellow //9
};
int main(int argc, char *argv[]) {
enum color mycolor;
mycolor = (enum color) (-6);
if (mycolor == Red) {
printf("ok!\n");
}
// 枚举值就是整型值, 它们是可以互通的,但是一般不这么使用
mycolor = (enum color) (20000);
printf("%d\n", mycolor);
int c = Red;
printf("%d\n", c);
return 0;
}
3. 用typedef来定义类型
- 使用typedef来定义新的类型名,来代替已有的类型名
typedef int INTEGER; // 用INTEGER代表了int
INTEGER a;
- 定义结构体变量
typedef struct date
{
int year;
int month;
int day;
}DATA;//定义结构体变量
DATA birthday;
DATA *p;//p为指向此结构体类型数据的指针
- 变形
a) typedef int NUM[100];//定义NUM为整型数组类型, NUM n ==> int n[100];
b) typedef char *PSTRING; //定义PSTRING为字符指针类型, PSTRING p ==> char *p
c) typedef int (*POINTER()); //定义POINTER为指向函数的指针类型,该函数返回的类型是int型, POINTER p1;
- 总结(以整型数组定义为例)
-
先写出常规的整型数组方法
-
将变量替换成自己想用的类型名
-
在前面加上typedef
1. int n[100];
2. int N[100];
3. typedef int N[100];
//最后定义对应变量
N a;
- 说明
-
类型别名一般都大写
-
typedef是用来定义类型名的,不是用来定义变量的
-
typedef只是对已经存在的类型增加类型名
-
typedef是编译的时候处理的, 可执行文件:编译(预处理(#define, #include, #ifdef),编译(typedef), 汇编),链接
-
typedef主要作用是:程序的通用性和可移植性