枚举,联合体

枚举

顾名思义就是把可能的取值一一列举。
比如我们现实生活中:
一周的星期一到星期天是有限的七天,可以一一列举。
性别有:男,女,保密,可以一一列举。等等
枚举类型的定义

enum Day //星期
{
    Mon,
    Tue,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun
};
enum Sex //性别
{
    male,
    female,
    secret
};

{}中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,默认从0开始,当然也可以在定义的时候赋初值。
例如:

enum Sex
{
    male=1,
    female=2,
    secret=0
};

枚举的优点:
1. 增加代码的可读性和可维护性。
2. 和define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止命名污染。
4. 便于调试。
5. 一次可以定义多个常量。
枚举的使用

enum color
{
    red = 1,
    green=2,
    blue=4
};
    enum color clr = green;
    clr = 6;

这样可以吗??
运行还是会打印1,2,4。所以枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。


联合体

联合是一种特殊的自定义类型,特征是成员共用同一块空间,所以联合体又称结构体。
联合类型的声明与定义

union Un
{
    char c;
    int i;
};
union Un un;

联合的特点
联合的成员共用同一块内存空间。
先看一段代码:

#include<stdio.h>
#include<stdlib.h>
union Un
{
    char c;
    int i;
};
int main()
{
    union Un un;
    printf("%d\n", &(un.c));
    printf("%d\n", &(un.i));
    system("pause");
    return 0;

}

运行:
这里写图片描述
由此课件un.c 与un.i所在的空间地址是一样的,即证明了联合共用同一块空间。
联合大小的计算
1. 联合的大小至少是最大成员的大小。
2. 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到它的最大整数倍。
对齐数=编译器默认的一个对齐数与该成员大小的较小值。VS默认对齐数 8 Linux 默认对齐数 4。
练习

union Un
{
    char c;
    int i;
};

char c 1个字节,最大对齐数为1;
int i 4个字节,最大对齐数为4;
4是最大对齐数4的倍数,所以sizeof(union Un)=4;

union Un1
{
    char c[5];
    int i;
};

char c[5] 5个字节,最大对齐数为1;
int i 4个字节,最大对齐数为4;
5不是最大对齐数4的倍数,所以sizeof(union Un)=8;
当前机器的大小端问题

#include<stdio.h>
#include<stdlib.h>
union Un
{
    char c;
    int i;
};
int main()
{
    union Un un;
    int ret = 0;
    un.i = 1;
    ret = un.c;
    if (ret == 0)
    {
        printf("大端!\n");
    }
    else
        printf("小端!\n");
    system("pause");
    return 0;
}

分析:
这里写图片描述
运行:
这里写图片描述


联合和结构体的巧妙应用
关于结构体的知识:结构体
将long类型的IP地址,转为点分十进制表示
参考代码:

#include<stdio.h>
#include<stdlib.h>
union ip_addr
{
    unsigned long addr;
    struct              //匿名结构体类型
    {
        unsigned char c1;
        unsigned char c2;
        unsigned char c3;
        unsigned char c4;
    }ip;
};
int main()
{
    union ip_addr my_ip;
    my_ip.addr = 176238749;
    printf("%d.%d.%d.%d\n", my_ip.ip.c4, my_ip.ip.c3, my_ip.ip.c2, my_ip.ip.c1);
    system("pause");
    return 0;
}

运行:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/80539028