枚举与联合体的介绍与实例

一、枚举(enum)

介绍:

   枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。

定义

先定义枚举类型,再定义枚举变量

enum Sex
{
    Male, Female, Secret
};
enum Sex sex;

 ②定义枚举类型的同时定义枚举变量

enum DAY
{
  Male,Female,Secret
} sex;


匿名定义枚举变量(只能定义一个)

enum
{
  Male,Female,Secret
} Sex;

 

初始:

复制代码
enum Sex
{
    Male,       //第一个枚举常量默认为0
    Female = 2, //可给枚举常量赋值(只能赋值一次)
    Secret      //值为3,默认为前面的值+1
};
//enum Sex sex = 3; 这样写在C语言中不会报错,但在C++中会报错
enum Sex sex = (Sex)3;
printf("%d",sizeof(Sex)); //enum类型默认为4个字节
复制代码

优点:

 1,增加代码的可读性和可维护性
 2,和#define 定义的标识符比较枚举有类型检查,更加严谨
 3,防止命名污染(命名冲突)
 4,便于调试,例如定义了SUM=3, 调试时枚举可以看到实际值3,#define只是看到SUM,不知道实际值
 5,使用方便,一次可以定义多个常量

扩展:

  在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。

  不过在一些特殊的情况下,枚举类型的值连续可以实现有条件的遍历

复制代码
enum DAY
{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

int main()
{
    for (day = MON; day <= SUN; day++)
    {
        
    }
}
    
复制代码

二、联合体(union)

介绍:

联合体里面所有成员都共用一块内存,使用时候,所有成员属性选一个。

定义:

 

先定义union类型,再定义union变量

 

 

union Un
{
    int  a;
    char b[5];
};
union Un un;

 

定义union类型的同时定义union变量

 

union Un
{
    int  a;
    char b[5];
}un;

 

匿名定义union变量(只能定义一次)

 

union
{
    int  a;
    char b[5];
}un;

 

注意:

   联合的成员是公用同一块内存空间的,这联合体的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍时就要对齐到最大对齐数的整数倍

 

union Un
{
    int  a;    // 4 8
    char b[5]; // 5 8
};
printf("%d", sizeof(Un)); //结果为8

 扩展:

验证编译器的大小端存储模式

int a = 11223344,其在内存中的二进制补码为:

00000000 10101011 01000001 00110000

大小端存储模式:

低地址-----------------------------------------------------------高地址
 .......[ ][ ][00000000][10101011][01000001][00110000][ ][ ]........ 大端字节序存储模式
 .......[ ][ ][00110000][01000001][10101011][00000000][ ][ ]........ 小端字节库存储模式

 由此可见,数据的低字节存在高地址的存储模式为大端字节序存储模式

数据的低字节存储在低地址的存储模式为小端字节序存储模式。

验证法一:
        将a的整型地址强制转换为字符型地址再解引用( *(char*)&a )观察其值,

若为0则说明是大端模式,若为48(00110000)则说明是小端字节序存储模式

验证法二:
        union Un
        {
            int  a;
            char b;
        };
        union Un un;
        通过给un.a赋值,查看un.a与un.b的值

 

 ②分离高低字节

单片机中经常会遇见分离高低字节的操作,比如进行计时中断复位操作时往往会进行

    (65535-200)/256;

    (65535-200)%256

    这样的操作,而一个除法消耗四个机器周期,取余也需要进行一系列复杂的运算,如果在短时间内需要进行很多次这样的运算无疑会给程序带来巨大的负担。其实进行这些操作的时候我们需要的仅仅是高低字节的数据分离而已,这样利用联合体我们很容易降低这部分开销。需注意的是:联合体内数据是按地址对齐的。具体是高位数据还是低位数据要看平台的大小端模式,例如51是大端,stm32默认是小端。


union div
{
    int time_count;        // time_count中存放要进行分离高低字节的数据
    char T1[2];            // 在keil c中一个整形占两个字节,char占一个字节,所以n与数组a占的字节数相同
}test;
test.time_count = 65535-200; 
TH1 = test.a[0];    // test.T1[0]中存储的是time_count 高位数据
TL1 = test.a[1];    // test.T1[1]中储存的是time_count 低位数据

 

 

 

posted @   ★☆★☆★  阅读(177)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示