关键字_自定义数据类型_6

关键字_自定义数据类型

为什么要有自定义数据类型
C编译器默认定义内存分配的数据类型不符合实际资源的形式,所以有了自定义数据类型,自定义 = 基本元素(标准数据类型)的集合。我们的标准数据类型只是描述外界数据类型的最小单位,如果描述更负责的数据类型,或者对象,用基本的数据类型是很难满足我们的要求的,C语言也不可能把我要用的全部数据类型进行定义,所以为我们提供了新的数据类型叫自定义数据类型。
1、 struct
2、 union
3、 enum:枚举
4、 typedef:别名
1、struct:元素之间的和(这里占用的内存大小所有元素的和)

struct myabc{
	unsigned int a;
	unsigned int b;
	unsigned int c;
unsigned int d;
};

这里内存空间并没有申请,只是告诉编译器我自己定义了一个数据类型,告知编译器我具备了myabc空间定义的能力,如何定义变量尼,就类似于“Int a”这里的int数据类型和自定义数据类型struct abc的性质是一样的,只是struct这个类型比较复杂。那“Struct myabc mybuf”才是真正的分配了内存空间a,b,c,d顺序是有要求的。
Union:共用起始地址来申请一段内存空间,应用场景更多的是技巧行代码,可能会修改上一次对这块空间的赋值。
2、union

union myabc{
	char a;
	int b;
}

这里只是声明了数据类型,并没有使用该数据类型定义变量
定义变量:union myabc abc定义了union myabc数据类型的abc变量,分配了内存空间。
3、enum:
enum 枚举名称{常量列表};
Enum是被命名的整形常数的集合。地位:enum是32个关键词词中地位很低的关键词,可有可无的关键词,如果我们用含有enum关键词的实现了一段代码,一定可已找到别的方法来实现,所以更多了解enum在什么场景下使用。
Enm是enumerate的缩写,一一列举的意思,enum是定义一个集合,和结构很像,结构体是将一堆变量打包了,enum是将一堆整型常数打包了,常数就是在程序编译的时候已经确定好了,是不能被修改的,最典型的定义常数的方法就是用宏来定义。

# define MON 0
# define TUE 1
# define WED 2

上面用宏实现的就等于用枚举实现的enum abc{MOD = 0,TUE,WED};这里就用abc这个名字描述了上面用宏定义的三个的集合的名字,这里abc也可以不写的,直接写成enum {MOD = 0,TUE,WED},因为用只是用这里面的常量值,可以不用名字。
这里enum中的元素默认都是常量从0开始,后面逐渐进行递增,如果指定了第一个为1后面也是逐步递增2,3,4,这里指定的就输出指定的数字,不指定的就根据前一个指定的递增。

Vi 005.c,编辑代码
# include <stdio.h>
  
enum abc{MOD, TUE, WED};

int main(void){
        printf("%d\n%d\n%d\n", MOD, TUE, WED);

        return 0;
}

编译链接“gcc -o build 005.c”,执行”./build”,执行结果如下
在这里插入图片描述
enum只是一个整形,所以只能用32个bit来存它,其实她的语法很弱,编译器很多时候都是无视它的,enum不用当成一个强制符号,之当成人和人交流的限制符。
这里我们来看一下enum的内存占用大小

# include <stdio.h>
  
enum abc{MOD, TUE, WED};

int main(void){

        enum abc week;
        printf("%lu\n", sizeof(week));
        printf("%d\n%d\n%d\n", MOD, TUE, WED);

        return 0;
}

在这里插入图片描述
目前根据输出结果是占用了4个字节,那么其实,这个week变量返回的就是一个整形变量,那么我们可以给这个整形变量来赋值,例如week = MON,修改一下代码,输出结果为0。
在这里插入图片描述
如果给这个week赋值其他的尼,不赋值enum中包含的元素尼比如:enum abc week = 144。
在这里插入图片描述
编译并没有出错,输出结果为144,这个样子可以看出enum并不是一个强制数据类型,编译器对它的制约很小,语法十分的弱,由此可见enum并不是一个强制符号,而是为了方便任何人交流限制符。

Enmu week{
	Monday = 0; Tuesday;Wednesday =2; Thursday; Friday; Saturday; Sunday
};

4、 typedef:别名
我们不能说这个新的内存空间,只是对一个已经定义好的数据类型起一个别名,这样子的好处在于增加代码的可读性。
Int a;a是一个int类型的整形变量;
Typedef int a;a是一个int类型的外号,这里只是进行重命名,这里的a就不是变量,没有想上面int a;分配内存空间大小;这里可以写a mysize,这里的意思就是mysize是一个a类型的变量,当然这里的意义并不大,以后在结构体和指针中的应用相对来说会有更多的应用,这里有一个不成文的规定,当我们看到xx_t的时候,这个一定是通过了typedef对数据类型进行了重命名,比如 tepedf int a_t。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值