Linux C语言 16-枚举&共用体
本节关键字:Linux、C语言、枚举(enum)、共用体(union)
相关C库函数:sizeof、printf
枚举
一种自定义类型,使用自定义名称代替数字常量,使代码更加清晰易懂。
枚举的大小及使用方法
大小:1个int(4字节)
使用方法:
- 只读
- 初始化不能为小数
- 使用时直接调用,不需要像结构体那样写“.”或者“->”
- 成员未初始化,第一个默认为0,后边一次加1
- 部分定义,定义变量后的变量会从定义变量依次加1
枚举的使用
#include <stdio.h>
enum WEEK1
{
mon, tue, web, thu, fri, sat, sun
}; // 打印为 0,1,2,3,4,5,6
enum WEEK2
{
mon2=5, tue2, web2, thu2=100, fri2, sat2, sun2
}; // 打印为 5,6,7,100,101,102,103
enum TEST
{
a, b, c, d, e, f, g, h, i, j, k,
};
enum WEEK1 w1;
enum WEEK2 w2;
printf("WEEK1 size: %d\n", sizeof(enum WEEK1));
printf("TEST size: %d\n", sizeof(enum TEST));
printf("WEEK1: %d, %d, %d, %d, %d, %d, %d\n", mon, tue, web, thu, fri, sat, sun);
printf("WEEK2: %d, %d, %d, %d, %d, %d, %d\n", mon2, tue2, web2, thu2, fri2, sat2, sun2);
// 枚举的遍历,只能遍历连续的
for (w1=mon; w1<=sun; w1++)
printf("遍历%d: %d\n", w1, w1);
// 将整型强转为枚举类型
int iNum1 = 2;
int iNum2 = 10;
w1 = (enum WEEK1)iNum1;
w2 = (enum WEEK2)iNum2;
printf("w1=%d, w2=%d\n", w1, w2);
// mon = 999; // 有的版本编译时不报错,但是不能实现赋值
// printf("mon=%d\n", mon);
/** 运行结果:
WEEK1 size: 4
TEST size: 4
WEEK1: 0, 1, 2, 3, 4, 5, 6
WEEK2: 5, 6, 7, 100, 101, 102, 103
遍历0: 0
遍历1: 1
遍历2: 2
遍历3: 3
遍历4: 4
遍历5: 5
遍历6: 6
w1=2, w2=10
*/
共用体
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
共用体的定义
union [tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。
共用体使用示例
#include <stdio.h>
#include <string.h>
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %f\n", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);
return 0;
}
/** 运行结果:
data.i : 10
data.f : 220.500000
data.str : C Programming
*/
使用共用体判断大小端模式
小端模式
小端模式是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
大端模式
大端模式是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 也就是我们人类读数字的顺序,我们从左往右读,byte的摆放也就从高字节到底字,从左往右进行摆放。
大小端模式的判断
#include <stdio.h>
union T
{
int num;
char c;
};
int main(void)
{
union T data;
data.num = 0x12345678;
if (data.c == 0x78)
printf("Little Endian\n");
if (data.c == 0x12)
printf("Big Endian\n");
return 0;
}