C语言学习篇(七)—— 自定义类型

本文介绍了C语言中的枚举和联合体两种自定义类型。枚举用于定义固定选项,增加代码可读性和可维护性,提供类型检查。联合体则通过共享内存空间节省空间,适用于不同时使用的属性。文章通过实例展示了如何定义和使用枚举及联合体,并提供了判断计算机大小端存储的示例。
摘要由CSDN通过智能技术生成

自定义类型——枚举和联合体

1.枚举

        枚举就是把所有可能的取值都意义列举。其在C语言的定义为“enum (key)  { valus };”

//定义性别的枚举
enum Sex
{
    MALE,   //男
    FEMALE, //女
    SECRET  //保密
};
enum Sex2
{
	MALE_1 = 2,
	FEMALE_1 = 1,
	SECRET_1 = 0 
};
//使用枚举
int main()
{
    enum Sex s = MALE; 
    //初始化枚举为“MALE”,枚举是将所有可能都一一举出了,所以初始化只能取定义里面的值
    printf("%d",s);  //值为0
    //枚举里面的元素的默认是从0开始排序的
    printf("%d %d %d", MALE_1, FEMALE_1, SECRET_1); //  2 1 0
    //枚举里面的属性也可以在定义是修改值,但不能在调用时再进行定义
    return 0;
}

枚举的优点(为什么要使用枚举):

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

C语言的运行在计算机里的过程:

        C语言的源代码 -->  预编译  -->  编译  -->  链接  -->  可执行程序 --> 运行(调试)

2.联合(联合体、共用体) 

         联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,联合体的成员是共用一块内存空间的,因此这个一个联合变量的大小,至少是最大成员的大小,所以联合体的使用,对联合成员同一时间只能使用一个。

        联合体的定义:union (key) { valus };

//联合体的定义
union Un
{
    char c; 
    int i;
};

int main()
{
    union Un u;
    printf("%p %p %p \n",&u,&u.c,&u.i ); //运行结果三个都一样
    //联合体的特点就是共用一个内存,极大的节省了空间
    printf("%d \n",sizeof(u)); // 4 
    //联合体的内存空间为最大成员的内存
    return 0;
}

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

例题:

        判断计算机的大小端存储问题

                             低地址  ------- 高地址
                    [][]……[11][22][33][44]……    大端存储模式
                    [][]……[44][33][22][11]……    小端存储模式

// 这里以储存1为例八位为例
//1 -->  00000001  
//如果其为大端存储方式的话内存中的第一个char就应该为 ‘00’
//如果其为小端存储方式的话内存中的第一个char就应该为 ‘01’
//指针方式:取 1 的第一个char值,判断为0还是1即可
//联合体方式:因为联合体是共用一个内存的,因此定义一个int类型跟一个char类型,int类型初始
//化后,内存中为 1 的值,所以char的定义就为int空间的第一个字节

check_sys(int x)
{
	//return *(char*)&x; //指针方法
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;  // 联合体方式
}

int main()
{
	int a = 1;
	int ret = check_sys(a);
	ret ? (printf("小端")) : (printf("大端"));
	return 0;
}

图解联合体共用内存: 

 总结:对于枚举跟联合体,其C语言的定义跟结构体是相同的,不同的是其性质不一样。结构体适用于对象的定义,枚举则是用于固定的选项时定义,联合体是为了节省空间,可以用于对一些不适合同时使用而属性又不相同的元素。

        目前是对C语言相关基础的知识进行系统的学习和笔记,后期再对数据结构的相关知识进行学习和笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值