上次,我们实现了成绩排序的功能,但是呢,并不是每个时候我们都是每人每科都考试的,比如我们学校江苏省最近省测,每个人只考一门,如果使用struct的话就显得浪费了,那么我们今天就来多学习一个新的数据结构来解决这个问题。
/1.sizeof运算符/
在上文中,我们提到“如果用struct就显得浪费了”,那么我们该怎样证明struc浪费呢?
我们都知道,计算机储存数据的地方叫做内存,我们程序中的每一个值都是储存在内存中的,不过占的内存大小不同,所以我们可以通过占的内存大小来判断是否“浪费”。
c++为此提供了一个运算符,叫做sizeof。
我们来看看它的用法吧:
struct student{ int math; int chinese; int english;};int main(){ int a[10] = {1,2,3,4,5,6,7,8,9,0}; cout << sizeof(int) << endl; // 输出数据类型大小 cout << sizeof(1+2) << endl; // 输出表达式大小 cout << sizeof(a) << endl; // 输出数组大小 cout << sizeof(student) << endl;// 输出结构体大小 return 0;}
运行结果如下:
从运行结果可以看出,int类型占4个Byte(字节),数组的大小是数组长度*数组每个元素大小(在本例中10*int=10*4=40),结构体的大小是结构体中每个变量大小之和(在本例中int+int+int=4*3=12)。
/2.共用体/
在上面例子中我么可以看到,就算我们没有赋值,student结构体的大小依然是12字节,这就造成了资源的浪费。
而今天我们要介绍的“共用体union”就不会发生这种问题,union更像一种只允许有一个键的字典:
union student{ int math; int chinese; int english;};int main(){ student a; a.math = 100; cout << sizeof(a) << endl; cout <endl; return 0;}
上面例子的运行结果:
看!同样的代码,union比struct整整小了三倍!
但是union只允许存在一个变量被赋值,其他变量在这时候会变成一样的值:
cout << a.chinese << endl; cout << a.english << endl;
输出为100 100。
union更像是一个变量,它的值以最后更改的为准:
int main(){ student a; a.math = 100; cout << a.math << endl; cout << a.chinese << endl; a.chinese = 99; cout << a.math << endl; cout << a.chinese << endl; return 0;}
输出:
今天你学废了吗