1.typedef 声明
typedef用于将一个标识符声明成某个数据类型的别名。
typedef 己有类型名 新类型名表;
其中新类型名表中可以有多个标识符,它们之间以逗号分隔。例如:
typedef int natural;
typedef double area, volume;
2.枚举类型-enum(枚举类型实际上是对整数的集合)
当某一类数据只有有限的几种可能值时,可以采用枚举类型来表示。
enum 枚举类型名 {变量值列表};
例如:enum weekday {sun,mon, tue, wed, thu, fri , sat};
应用枚举类型需要注意:
1.对枚举元素按常量处理,不能对它们赋值。如下面是非法操作:
sum = 0; // sun是枚举元素,此语句非法
2.枚举元素具有默认值,他们依次为:0,1,2,……,例如上例中sun的值为0,mon为1,……,sat为6.
3.也可以在声明时另行定义枚举元素的值,如:
enum weekday {sun = 7,mon = 1, tue ,wed , thu, fri,sat};
//定义sun 为7 , mon 为1, 以后顺序加1,sat为6.
weekday result; //声明变量时,可以不写关键字enum
enum weekday result = mon; // 也可以在类型名前写enum
注意的是声明的变量result的取值只能是枚举类型weekday中几个值之一。
3.结构体
枚举类型它变量的取值是整数,如果没有给它们具体指定某一整数值,则从0开始依次递增赋值,即枚举类型其实就是一个整数的集合。但是在很多情况下,需要将一些不同类型的数据组合成一个整体。此时就需要将它声明为一个结构体类型,结构体是由不同数据类型的数据组成的集合体。下面是一个结构体的声明:
struct student //学生信息结构体 struct是关键字,student是结构体名称
{
int num ;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu = {97001,"Lin",‘F’,19,99.9,"street"};
但是仅仅声明结构体类型是不够的,要使用结构体数据,还要声明结构体变量。可以通过如下方式声明一个结构体类型变量:结构名 结构变量名; 需要注意:
结构变量声明在结构类型声明之后,二者也可以同时进行,如上例的stu;
结构变量占用内存大小可以用sizeof运算符求出:sizeof(类型名或变量名)
说明结构变量的同时可以直接设置初值,如上面的stu 的初值{97001,"Lin",‘F’,19,99.9,"street"};
4.联合体
有时需使几个不同类型的变量共用同一组内存单元,这时就可声明一个联合体类型,一个联合体声明如下:
union uarea // union 是联合声明的关键字, uarea 是联合名
{
char c_data;
short s_data;
long l_data;
};
联合体类型变量说明的形式: 联合名 联合变量名;
联合体类型变量的引用形式: 联合变量名. 成员名
联合体可以不声明名称,称为无名联合体,只是声明一个成员项的集合,这些成员项具有相同的内存地址,可以由成员项的名字直接访问。
union {
int i;
float f;
};
无名联合体通常用作结构体的内嵌成员。还需要注意的是联合体结构的大小问题:
解惑:sizeof(联合)这个值是怎么计算的,如下代码结果为什么是24?
union DATE
{
char a;
int i[5];
double b;
};
DATE max;
cout<< sizeof(max) << endl;
摘几句The C Programming Language里面讲述这个问题的原话,以说明读书还是必要的:
①联合就是一个结构,②它的所有成员相对于基地址的偏移量都为0,③此结构空间要大到足够容纳最“宽”的成员,④并且,其对齐方式要适合于联合中所有类型的成员。
怕有的兄弟还不明白,特附图一个帮助理解:
char a; => x
int i[5]; => x
x
x
x
x
x
double b; => x
该结构要放得下int i[5]必须要至少占4×5=20个字节。如果没有double的话20个字节够用了,此时按4字节对齐。但是加入了double就必须考虑double的对齐方式,double是按照8字节对齐的,所以必须添加4个字节使其满足8×3=24,也就是必须也是8的倍数,这样一来就出来了24这个数字。综上所述,最终联合体的最小的size也要是所包含的所有类型的基本长度的最小公倍数才行。(这里的字节数均指winnt下的值,平台、编译器不同值也有可能不同。)
联合在存储分配的时候用的机会最多,因为很少有像存储分配这样需要给多种不同类型的变量分配空间而又打算尽可能的节约内存的,这很适合联合的特性。上述对齐的方式有个很有趣的用法也就常在存储分配里面使用。
所以联合体的大小是能容纳它的最大成员的宽度(并且需要考虑字节对齐方式)
unint DATE
{
char a;
int i[5];
double b;
};
DATE max;
cout<<sizeof(max)<<endl; // sizeof(max) = 24
cout<<sizeof(max.a)<<endl; //sizeof(max.a) = 1
cout<<sizeof(max.i)<<endl; //sizeof(max.i) = 20 注意这里是20 不是4!
cout<<sizeof(max.b)<<endl; //sizeof(max.b) = 8