16.1 结构变量

  1. 联合是具有不同类型的值的集合(1)
  2. 结构体变量的初始化
    1. 可以短于初始化,剩余的成员用 0 表示
  3. 对结构的操作
    1. . 操作符取值,点操作符的优先级位于最高级(3)
    2. 对结构体输入值(4)
    3. 可以对相同类型的结构体相互赋值(5)
  1. // 1
  2. // 定义仓库中零件信息的结构体
  3. struct
  4. {
  5. // 编号
  6. int number;
  7. // 名称
  8. char name[NAME_LEN+1];
  9. // 现有数量
  10. int on_hand;
  11. } part1,part2;
  12. // 2
  13. // 定义仓库中零件信息的结构体,并初始化
  14. struct
  15. {
  16. // 编号
  17. int number;
  18. // 名称
  19. char name[NAME_LEN+1];
  20. // 现有数量
  21. int on_hand;
  22. } part1={528,"Disk drive",10},
  23. part2 = {914,"Printer cable",5};
  24. // 3
  25. #include <stdio.h>
  26. // 定义仓库中零件信息的结构体
  27. struct
  28. {
  29. // 编号
  30. int number;
  31. // 名称
  32. char name[20];
  33. // 现有数量
  34. int on_hand;
  35. } part1={528,"Disk drive",10},
  36. part2 = {914,"Printer cable",5};
  37. int main()
  38. {
  39. printf("打印出 part1 的 number 编号:%d\n",part1.number);
  40. }
  41. // 输出
  42. 打印出 part1 number 编号:528
  43. // 4
  44. #include <stdio.h>
  45. // 定义仓库中零件信息的结构体
  46. struct
  47. {
  48. // 编号
  49. int number;
  50. // 名称
  51. char name[20];
  52. // 现有数量
  53. int on_hand;
  54. } part1={528,"Disk drive",10},
  55. part2 = {914,"Printer cable",5};
  56. int main()
  57. {
  58. printf("修改 part1 的 number 编号:") ;
  59. // 注意 scanf 中不能在 %d 后面加 /n
  60. scanf("%d",&part1.number);
  61. printf("打印出 part1 的 number 编号:%d\n",part1.number);
  62. }
  63. // 输出
  64. 修改 part1 number 编号:615
  65. 打印出 part1 number 编号:615
  66. // 5
  67. #include <stdio.h>
  68. // 定义仓库中零件信息的结构体
  69. struct
  70. {
  71. // 编号
  72. int number;
  73. // 名称
  74. char name[20];
  75. // 现有数量
  76. int on_hand;
  77. } part1={528,"Disk drive",10},
  78. part2 = {914,"Printer cable",5};
  79. int main()
  80. {
  81. part1 = part2;
  82. printf("%d,%s,%d\n",part1.number,part1.name,part1.on_hand);
  83. }
  84. // 输出
  85. // 914,Printer cable,5

1. 结构体变量在内存中的存储

如,上面的 part1
image.png

16.2 结构类型

  1. 不是在同一处定义的结构体变量,即使完全一致的结构,也被认为是不一样的结构(1)
  2. 结构体标记的声明:用于解决在替他地方声明结构体(2)
  3. 结构体使用 typedef 的方式
  4. 结构体作为参数(3)
  5. 结构体作为返回值(4)
  1. // 1
  2. #include <stdio.h>
  3. // 定义仓库中零件信息的结构体
  4. struct
  5. {
  6. // 编号
  7. int number;
  8. // 名称
  9. char name[20];
  10. // 现有数量
  11. int on_hand;
  12. } part1={528,"Disk drive",10};
  13. struct
  14. {
  15. // 编号
  16. int number;
  17. // 名称
  18. char name[20];
  19. // 现有数量
  20. int on_hand;
  21. } part2 = {914,"Printer cable",5};
  22. int main()
  23. {
  24. // 此处报错,因为不是在同一处一起定义的
  25. part1 = part2;
  26. }
  27. // 2
  28. #include <stdio.h>
  29. // 定义仓库中零件信息的结构体
  30. struct part
  31. {
  32. // 编号
  33. int number;
  34. // 名称
  35. char name[20];
  36. // 现有数量
  37. int on_hand;
  38. } part3,part4; // 1. 可以在标记时同时声明变量
  39. int main()
  40. {
  41. // 2. 也可以单独声明变量
  42. struct part part1,part2;
  43. struct part part5;
  44. // 3. 这样在别处声明的同一类型的变量就可以相互赋值了
  45. part5 = part1;
  46. }
  47. // 3
  48. #include <stdio.h>
  49. struct part
  50. {
  51. int number;
  52. char name[20];
  53. int on_hand;
  54. } part1 = {512,"disk driver",100};
  55. void print_part(struct part p);
  56. int main()
  57. {
  58. print_part(part1);
  59. }
  60. void print_part(struct part p)
  61. {
  62. printf("part number:%d\n",p.number);
  63. printf("part name:%d\n",p.name);
  64. printf("on hand:%d\n",p.on_hand);
  65. }
  66. // 输出
  67. part number:512
  68. part name:6487556
  69. on hand:100
  70. // 4
  71. #include <stdio.h>
  72. #include <string.h>
  73. struct part
  74. {
  75. int number;
  76. char name[20];
  77. int on_hand;
  78. } part1;
  79. struct part build_part(int number,const char *name,int on_hand);
  80. int main()
  81. {
  82. part1 = build_part(528,"disk driver",10);
  83. }
  84. struct part build_part(int number,const char *name,int on_hand)
  85. {
  86. struct part p;
  87. p.number = number;
  88. strcpy(p.name,name);
  89. p.on_hand = on_hand;
  90. return p;
  91. }

16.3 数组和结构的嵌套

  1. 结构体嵌套结构体(1)
  2. 结构数组(2)
    1. note:scanf 一个数组元素,如果格式是 &s[0],前面需要加上 & 符号
    2. 结构数组的初始化(3)
  1. // 1
  2. #include <stdio.h>
  3. struct person
  4. {
  5. int age;
  6. char name[20];
  7. };
  8. struct student
  9. {
  10. struct person sp;
  11. int classes;
  12. };
  13. int main()
  14. {
  15. struct student s1,s2;
  16. printf("输入年龄:");
  17. scanf("%d",&s1.sp.age);
  18. printf("录入年龄:%d",s1.sp.age);
  19. }
  20. // 输出
  21. 输入年龄:11
  22. 录入年龄:11
  23. // 2
  24. #include <stdio.h>
  25. struct person
  26. {
  27. int age;
  28. char name[20];
  29. };
  30. struct student
  31. {
  32. struct person sp;
  33. int classes;
  34. };
  35. int main()
  36. {
  37. struct student s[5];
  38. printf("输入年龄:");
  39. scanf("%d",&s[0].sp.age);
  40. printf("录入年龄:%d",s[0].sp.age);
  41. }
  42. // 输入
  43. 输入年龄:12
  44. 录入年龄:12
  45. // 3
  46. struct student s[2] =
  47. {
  48. {{11,"lili"},106},
  49. {{12,"zhangsan"},108}
  50. };

16.4 联合

  1. 联合的成员共享同一存储空间,且每次只能存储一个成员
  2. 编译器只为联合中最大的成员分配足够的空间(1)
  3. 结构体的成员存储在不同的内存中,而联合体存储在同一内存区域,这将导致后赋值的成员覆盖先赋值的成员(2)
  4. 联合体的初始化只能用于赋值给第一个成员
  1. // 1
  2. #include <stdio.h>
  3. union
  4. {
  5. int i;
  6. float f;
  7. }u;
  8. int main()
  9. {
  10. printf("%d",sizeof(u));
  11. }
  12. // 输出,输出的 float 的大小
  13. 4
  14. // 2
  15. #include <stdio.h>
  16. union
  17. {
  18. int i;
  19. float f;
  20. }u;
  21. int main()
  22. {
  23. u.i = 1;
  24. u.f = 1.2;
  25. printf("%d,%f",u.i,u.f);
  26. }
  27. // 输出,可以看到 u.i 的值已经找不到了
  28. 1067030938,1.200000

16.5 枚举