12.1

结构体嵌套

在一个结构体中,有成员也是结构体。

  1. #include<stdio.h>
  2. struct stu{
  3. char name[10];
  4. int age;
  5. };
  6. struct teach{
  7. char teaname[10];
  8. struct stu st;
  9. int teaage;
  10. };
  11. int main(void){
  12. struct teach a={"老师",{"学生",18},27}; //st的花括号可以不加,但为了区分最好叫上。
  13. printf("%s,%s,%d,%d",a.teaname,a.st.name,a.st.age,a.teaage);
  14. return 0;
  15. }

结构体数组

数组的每个元素是结构体的数组

  1. struct teach{
  2. char teaname[10];
  3. int teaage;
  4. };
  5. int main(void){
  6. struct teach tea[3]={{"tea0",17},{"tea1"},{"tea2",19}};//内里的花括号可以不写,当初始化所有数据时
  7. printf("%s,%d",tea[0].teaname,tea[2].teaage);
  8. return 0;
  9. }

结构体大小

内存对齐

是数据存储规则,执行效率快,但是浪费空间

以最大类型为字节对齐宽度

结构体大小计算规则

  1. struct stu{
  2. char c;
  3. int i;
  4. double d;
  5. short s;
  6. };
  7. int main(){
  8. struct stu st;
  9. printf("%u,%u\n",sizeof(struct stu),sizeof(st)); //占24字节
  10. return 0;
  11. }

double为最大类型,所以以8字节为对齐宽度

char占一个字节,剩下的七个字节完全可以放下一个int

所以char和int再次内存对齐,以4字节为对其宽度

所以char和int共用八字节,double用八字节,short用八字节,共24字节

  1. struct stu{
  2. char c;
  3. int i;
  4. short s;
  5. double d;
  6. };
  7. int main(){
  8. struct stu st;
  9. printf("%u,%u\n",sizeof(struct stu),sizeof(st)); //占16字节
  10. return 0;
  11. }

手动设置字节对齐

  1. #pragma pack(4)

最大只能设置到结构体本身最大类型的字节长度

union

所有成员共用一个空间

如果初始化一个成员,那么其他的成员自动初始化为零(共用一个空间)

一般初始化最大的成员

  1. union un{
  2. char c;
  3. short s;
  4. int i; //把要初始化的放在最前面
  5. }un1;
  6. int main(){
  7. union un un2={.i=34}; //不指向的话按顺序初始化,有的编译器不支持,把要初始化的放在最前面
  8. }

相反次序输出所有字符

输入十个整数存入一维数组中,将最大数与最后一个数交换,最小数与第一个是交换