C_11_位段,共同体,枚举

位段

位段也称 位域

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值