关键字_自定义数据类型
为什么要有自定义数据类型
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。