今天我们来学习一下自定义类型,自定义类型包括结构体、枚举、联合体,小编觉得挺不错的,现在就分享给大家,也给大家做个参考
一、什么是结构体
结构是称为成员变量的值的集合。结构的每个成员可以是不同类型的变量。
//结构体声明struct tag //struct:结构体关键字,tag:标签名,合起来是结构体类型(类型名){member - list;//大括号里面的是结构体成员变量}variable - list;//结构体变量
1.结构体实现
代码如下:
#includelt;stdio.hgt; struct Book{char name3.结构的总大小是结构所有成员的最大对齐方式的整数倍。;//书名int price;//价格char id[20];//书号}b2,b3,b4;//结构体变量(全局变量)int main(){ //结构体变量(局部变量)struct Book b1 = { "c和指针", 30, "1112345454" };//结构体初始化struct Book* pb = amp;b1;printf("%s %d %s\n",b1.name,b1.price,b1.id );printf("%s %d %s\n", pb-gt;name, pb-gt;price, pb-gt;id);//指针方式打印 return 0;}
2.匿名结构体类型//匿名结构体类型struct{ int a; char b; float c;}s;//直接永匿名结构体类型创建了一个变量s,匿名结构体只能用一次 struct{ int a; char b; float c;}*ps;//匿名结构体的指针 结构在声明的时候省略掉了结构体标签(tag)就叫做匿名结构体。 那么问题来了?int main(){ ps = amp;s;//不合法,编译器会把上面的两个声明当成完全不同的两个类型。所以是非法的}
3.结构体自引用struct Node{ int data; struct Node* next;}//结构体自引用//这个节点能够找到同类型的下一个节点,这就叫结构体的自引用,我自己能找到同类型跟自己同类型的下一个元素就叫结构体的自引用。//结构体的自引用实现:在结构体里面包含同类型的结构体的指针。
4.结构体的内存对齐
你必须首先掌握结构的对齐规则:
1.第一个成员位于结构变量的偏移量为0的地址。
2.其他成员变量应该与某个数字的整数倍地址对齐(对齐号)。对齐号=编译器默认对齐号和成员大小的较小值。VS中的默认值是8。
3.结构的总大小是最大对齐数的整数倍(每个成员变量都有一个对齐数)。
4.如果嵌套结构的对齐方式是其最大对齐方式的整数倍,则该结构的整体大小是所有最大对齐方式(包括嵌套结构的对齐方式)的整数倍。
我们来计算一下为什么上面结构S的内存大小是12字节。
我用的是vs编译器,vs编译器默认对齐数是8。
1.结构的第一个成员从内存中结构变量的存储位置的0偏移量开始。
2.从第二个成员开始的所有成员都被放置在具有对齐号(成员的大小和默认对齐号的较小值)的整数倍的地址处。
[20]
5.结构体位段
段的声明和结构是相似的,但有两处不同:
1.位段的成员必须是int、unsigned int或signed int。
2.位段的成员名后面跟一个冒号和一个数字。
假设我们用二进制的形式表示性别,分为男、女、机密。可以分别用00,01,10来表示。这样我们连一个字节的大小都用不上,但是如果创建变量,一个int变量占用四个字节,那么位段一定程度上节省了空。
位的内存分配
1.位段的成员可以是int无符号int有符号int或char(属于整形家族)
2.位段的空空间根据需要开4字节(int)或1字节(char)。
3.双边投资条约涉及许多不确定因素。位不是跨平台的,所以可移植的程序应该避免使用位。
二、什么是枚举
有:男的,女的,机密的,你也可以一一列举。
月份有12个月,可以一一列举。
这里可以使用枚举。
枚举是为了创建一个新的类型。这种类型的值非常有限。只有几个可能的值,所以我们可以使用enumeration来创建一个枚举类型。
枚举的大小为4。
1.枚举类型的定义#includelt;stdio.hgt;//声明枚举类型enum Color//enum枚举关键字,Color枚举类型,{RED,//大括号里面放的是枚举的可能取值(常量)GREEN,BLUE};int main(){enum Color c = BLUE;return 0;}
大括号里的这些可能值都是有价值的。默认情况下,它们从0开始,每次增加1。当然,它们在定义时也可以被赋予初始值。
enum Color//颜色{ RED=1, GREEN=2, BLUE=4};
2.枚举的优点
我们可以使用#define来定义常数。为什么我们必须使用枚举?
枚举的优点:
1.增加代码的可读性和可维护性
2.与#define定义的标识符相比,enumeration有类型检查,更加严谨。
3.防止了命名污染(封装)。
4.易于调试
5.易于使用,可以一次定义多个常数
三、联合(共用体)
1.什么是联合(共用体)
Union也是一种特殊的自定义类型。这种类型定义的变量还包含一系列成员,其特点是这些成员共享同一个块空(所以union也叫公共体)。
2.联合(共用体)的定义//联合类型的声明union Un{ char c; int i;};//联合变量的定义union Un un;//计算连个变量的大小printf("%d\n", sizeof(un));
计算并集(公共体)的大小
为什么这里计算的结果是4?我们来看下图:
的联合成员共享相同的内存空,因此这种联合变量的大小至少是最大成员的大小(因为联合必须至少能够存储最大成员)。
3.联合(共用体)的初始化#includelt;stdio.hgt; union Un{char c;int i;};int main(){union Un u = { 10 };//初始化u.i = 1000;//成员变量单独初始化u.c = 100;printf("%p\n",amp;u );printf("%p\n", amp;(u.c));printf("%p\n", amp;(u.i));return 0;}
总结
这简要介绍了结构、枚举和联合的定义、初始化和简单使用。写得相当潦草。以上文章如有问题,欢迎各位大佬提问。我会虚心学习,虚心改正。最重要的是共同进步成长,学好编程。
这就是这篇关于C语言自定义类型的结构枚举联合体的文章。关于C语言自身结构的更多信息
精彩评论