12.1
结构体嵌套
在一个结构体中,有成员也是结构体。
#include<stdio.h>struct stu{char name[10];int age;};struct teach{char teaname[10];struct stu st;int teaage;};int main(void){struct teach a={"老师",{"学生",18},27}; //st的花括号可以不加,但为了区分最好叫上。printf("%s,%s,%d,%d",a.teaname,a.st.name,a.st.age,a.teaage);return 0;}
结构体数组
数组的每个元素是结构体的数组
struct teach{char teaname[10];int teaage;};int main(void){struct teach tea[3]={{"tea0",17},{"tea1"},{"tea2",19}};//内里的花括号可以不写,当初始化所有数据时printf("%s,%d",tea[0].teaname,tea[2].teaage);return 0;}
结构体大小
内存对齐
是数据存储规则,执行效率快,但是浪费空间
以最大类型为字节对齐宽度
结构体大小计算规则
struct stu{char c;int i;double d;short s;};int main(){struct stu st;printf("%u,%u\n",sizeof(struct stu),sizeof(st)); //占24字节return 0;}
double为最大类型,所以以8字节为对齐宽度
char占一个字节,剩下的七个字节完全可以放下一个int
所以char和int再次内存对齐,以4字节为对其宽度
所以char和int共用八字节,double用八字节,short用八字节,共24字节
struct stu{char c;int i;short s;double d;};int main(){struct stu st;printf("%u,%u\n",sizeof(struct stu),sizeof(st)); //占16字节return 0;}
手动设置字节对齐
#pragma pack(4)
最大只能设置到结构体本身最大类型的字节长度
union
所有成员共用一个空间
如果初始化一个成员,那么其他的成员自动初始化为零(共用一个空间)
一般初始化最大的成员
union un{char c;short s;int i; //把要初始化的放在最前面}un1;int main(){union un un2={.i=34}; //不指向的话按顺序初始化,有的编译器不支持,把要初始化的放在最前面}
