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}; //不指向的话按顺序初始化,有的编译器不支持,把要初始化的放在最前面
}