位段
位段也称 位域
1 字节 = 8 位域
概述:
特殊的结构体
大小按位分配
示例1:
struct packed_data { unsigned int a : 2; // 占2 位 unsigned int a : 4; // 占4 位 unsigned int a : 6; // 占6 位 unsigned int i; // 占4字节 32位 1b=8位 } data;
位段 不能取地址,因为地址最小都是1字节单位的存储
注意:
不能对位段成员取地址
赋值时,不要超出位段定义的范围
位段成员的类型必须指定为整形或字符型
一个位段必须存放在一个存储单元中,不能跨两个单元
位段的长度不能大于存储单元的长度
示例2:另起一行
#include <stdio.h> struct stu { char a : 3; char : 0; // 另起一行 char c : 2; } temp; int main(int argc, char const *argv[]) { printf("%d\n", sizeof(struct stu)); return 0; }
示例3:定义无意义位段
#include <stdio.h> struct stu { char a : 3; char : 2; // 无意义位段 char c : 2; } temp; int main(int argc, char const *argv[]) { printf("%d\n", sizeof(struct stu)); return 0; }
共用体:
共用体所有成员占有同一段地址空间(核心)
要是结构体 内存大小 是 8
但共同体按最大的算 类似大的覆盖小的 就是 4
概述:
共用体和结构体类似,也是一种构造类型的数据结构
在进行某些算法的时候,需要使几种不同类型的变量存到同一段内存单元中,几个变量
所使用空间相互重叠
共用体所有成员占有同一段地址空间(核心)
共用体的大小是其占内存长度最大的成员的大小
语法
typedef union 共用体名称 { 成员变量 } 别名;
特点
1、同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用 2、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖 3、共用体变量的地址和它的各成员的地址都是同一地址 4、共用体变量的初始化union data a={123}; 初始化共用体为第一个成员
枚举
概念
将变量的值一一列举出来,变量的值只限于列举出来的值的范围内
枚举类型也是个构造类型的
既然是构造类型的数据类型,就得先定义类型,再定义变量
语法:
enum 枚举类型名 { 枚举值列表; };
特点
枚举值是常量,不能在程序中用赋值语句再对它赋值
枚举元素本身由系统定义了一个表示序号的数值,默认是从0开始顺序定义为0,1,2…
可以改变枚举值的默认值
示例1:
#include <stdio.h> enum week // 枚举类型 { mon, tue = 3, wed, thu, fri, sat, sun // 注意:最后一个变量后不要加分号 }; int main(int argc, char const *argv[]) { enum week w01 = mon; printf("mon = %d\n", w01); enum week w02 = tue; printf("mon = %d\n", w02); enum week w03 = wed; printf("mon = %d\n", w03); /* 0:财务部 1:销售部 2:教学部 3:... */ return 0; }
示例2:
#include <stdio.h> typedef enum BuMen { CaiWu, RenShi, XiaoShou } BM; typedef struct YuanGong { char name[50]; char sex[10]; int age; double money; BM bm; } YG; int main(int argc, char const *argv[]) { YG yg01 = {"牛马一号", "男", 24, 3200, XiaoShou}; if (yg01.bm == XiaoShou) { printf("%s在销售部\n", yg01.name); } else { printf("%s不在销售部\n", yg01.name); } return 0; }