其中 stu 为结构体的 类型名; s1为 结构体变量名
结构体的大小: 以字节最大的单位 为地址对齐标准 ,如 结构体中 最大为 double,8个字节,那么 比它小的 单位就要凑齐 8的整数倍 字节大小。
例如:
struct stu { double c; int s; char k; }a;
double --8,int ---4,char ---1;所以以8字节对齐,总字节大小为8的倍数 8+4+1=13,而8字节对齐后,为16。
再例如: struct stu { double c; int s; char k; int l; }a;
a 的大小为 24;
struct stu { double c; char k[9]; }a;
a 的大小为24
union U中最大的是 9 个字节的 s[9],但 9 不能被 4 和 8 同时整除,而16可以,且16比9大。 所以 联合体所占空间 为16 个字节 如:
union { int i; char x[2]; }a;
int main(void) { a.x[0] = 10; a.x[1] = 1; printf("%d\n",a.i); return 0; } 由于 PC 机位小端序,因此 低字节放低地址。 对 x[2]赋值后,union 的地址空间的值为: 高地址 0000 0000|0000 0000|0000 0001| 0000 1010 低地址 (4个字节的存储空间) 因为 i 为 4 个字节,所以输出 256+10 = 266;
union u{ int i; char x[2]; };
int main(void) { union u a; memset(&a,0,sizeof(a)); //这步很关键,否则 union 的起始内存地址不会全是0,而是不确定 会造成无法预测 union u a 中 元素的值 a.x[0] = 10; a.x[1] = 1; printf("%d\n",a.i); return 0; }
枚举体的大小: 和指针一样,通通占4个字节。
定义一个枚举体:例如 enum weekday { sun,mon,tue,wed,thu,fri,sat };
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是 变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里 面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。
初始化一个枚举变量:(2种办法) (1)enum weekday day1; (2)enum weekday{sun,mon,tue,wed,thu,fri,sat} day;
枚举类型的值: ① 枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举 元素进行赋值。
② 枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为,1,2,…。 如: enum weekday { sun,mon,tue,wed,thu,fri,sat }; 默认下,sun = 0,mon = 1,tue = 2,依次加 1;
当然,也可以指定加的顺序: enum weekday{sun = 1,mon,tue,wed,thu,fri,sat}; 则 sun =1,mon =2 ,tue = 3...依次加一。 -------------------------------------------------------------------------------------------------- 几种 enum 情况:
enum weekday{
sun=1,mon=7,tue,wed,thu,fri
}day;
当 day = tue,printf(”%d“,day);结果 day = 8;同理,当 day = wed,day = 9;
enum weekday{
sun=1,mon=7,tue=mon+3,wed,thu,fri
}day;
当 day = tue,打印day 的值,day = 10;