struct
空结构体大小,依据编译器的不同而不同,gcc中为0,且不同的结构体变量地址相同;而在g++中为1,不同的结构体变量地址也不同。没有谁对谁错,现代编译器中认为空结构体大小为1较为合理。
柔性数组
即数组大小待定的数组。
规则:结构中最后一个元素允许是未知大小的数组;
结构中的柔性数组成员前面必须至少一个其他成员。
typedefstructflex
{
intlen;
intarray[];
}SoftArray;
array[]0个元素没有占用空间,所以sizeof(SoftArray)=4。
分配内存空间操作如下:
SoftArray*sa=(SoftArray*)malloc(sizeof(SoftArray)+10*sizeof(int));
此时sizeof(*sa)仍为4,柔性数组只是编外人员,不占用结构体的编制。只是说在使用柔性数组时需要把它当成结构体的一个成员而已,仅此而已。
union
只分配最大域的空间,所有域共享这个空间
union维护足够的空间来置放多个数据成员的“一种”,而不是为每个数据成员配置空间,在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。
大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
union型数据所占的空间等于其最大的成员所占的空间。对union型的成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始。
unionc
{
inti;;
charc;
};
unionccc;
cc.i=1;
printf("%d\n",cc.c);//若为1,则为小端模式;为0,则为大端模式
enum
是一种自定义类型,真真正正的常量
enum默认常量在前一个值的基础上依次加1
enum类型的变量只能取定义时的离散值,只能是int型
enum类型变量只能取值为花括号内的任何一个值
enumcolor
{
GREEN,
RED=2,
BLUE
};
enum变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0开始依次递增1。所以GREEN=0,BLUE=3。
枚举类型和#define区别
#define宏常量只是在预编译阶段简单的进行值替换,枚举常量是在编译的时候确定其值,是真正意义上的常量
#define宏常量无法被调试,枚举常量可以
#define宏常量无类型信息,枚举常量是一种特定类型的常量
typedef
用于给一个已经存在的数据类型重命名
并没有产生新的类型
typedef重定义的类型不能进行unsigned和signed扩展
typedef不能和static等存储类型指示符同时使用,因为每个变量只能有一种存储类型,所以代码:typedefstaticinti;是非法的。
typedef和#define区别
typedef是给已有类型取别名
#define为简单的字符串替换,无别名概念
typedefchar*PCHAR;
PCHARp1,p2;-->char*p1;char*p2;
#definePCHARchar*
PCHARp1,p2;-->char*p1,p2;-->char*p1;charp2;