C语言学习笔记-结构体、共用体、枚举

来源:互联网 发布:计算机专业不喜欢编程 编辑:程序博客网 时间:2024/05/16 23:40
枚举类型的定义形式为:

enum typeName{ valueName1, valueName2, valueName3, ...... };

注意最后的;不能少。

列出一个星期有几天:

  1. enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。

我们也可以给每个名字都指定一个值:

  1. enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更为简单的方法是只给第一个名字指定值:
  1. enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat
  2. , Sun };
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

-------------------------------------------华丽的分割线---------------------------------------------------

C语言共用体(Union)

union 共用体名{
    成员列表
};

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。


设计一个包含共用体的结构体:

  1. struct{
  2. char name[20];
  3. int num;
  4. char sex;
  5. char profession;
  6. union{
  7. float score;
  8. char course[20];
  9. } sc;
  10. } bodys[TOTAL];

0 0