Linux C语言 16-枚举&共用体

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值