【C语言】C语言结构体解析
来源:互联网 发布:淘宝补单技巧 编辑:程序博客网 时间:2024/05/24 02:37
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
下面是一段简单的程序:
#include <stdio.h>struct S{char a;int b;double c;};int main(){printf("%d", sizeof(struct S));system("pause");return 0;}在上面程序中,S为结构体的标志,并且声明了有三个成员的结构体,分别为char字符型,int整型,和双精度double型。
struct SIMPLE{ int a; char b; double c;};
同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c。结构体的标签被命名为SIMPLE,没有
声明变量。
用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
typedef struct{int a;char b;double c;} Simple2;
Simple2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。
结构体作用:
结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
位段:
位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用0或1表示,只需1位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。
位段的使用:
(1)位段成员的类型必须指定为unsigned或int类型。
(2) 若某一位段要从另一个字开始存放,可用以下形式定义:
unsigned a:1;
unsigned b:2;一个存储单元
unsigned:0;
unsigned c:3;另一存储单元
a、b、c应连续存放在一个存储单元中,由于用了长度为0的位段,其作用是使下一个位段从下一个存储单元开始存放。因此,只将a、b存储在一个存储单元中,c另存在下一个单元(“存储单元”可能是一个字节,也可能是2个字节,视不同的编译系统而异)。
(3) 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。
(4) 可以定义无名位段。
(5) 位段的长度不能大于存储单元的长度,也不能定义位段数组。
(6) 位段可以用整型格式符输出。
(7) 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。
(8) 位段定义的第一个位段长度不能为0。
- 【C语言】C语言结构体解析
- 解析C语言结构体
- C语言结构体解析
- 解析C语言结构体,位段
- 解析C语言结构体,位段。
- 解析C语言结构体,位段
- 解析C语言结构体、位段
- 简单解析C语言结构体
- 解析C语言结构体,位段
- 解析C语言结构体,位段
- C语言结构体
- C语言:结构体
- C语言:结构体
- C语言--结构体
- c语言结构体
- c语言 结构体
- C语言结构体
- C语言结构体
- linux-011文件系统节点操作函数解析
- Springboot的AOP不生效
- hdu 2476 String painter【区间dp】
- 关键性能指标及其度量方法
- linux-011中位图操作函数(申请释放节点,申请释放block)解析
- 【C语言】C语言结构体解析
- tomcat80端口访问网址
- python 多进程
- nginx反向代理及负载均衡
- ArrayList和LinkedList性能比较分析
- linux nmon的安装及使用
- 以太坊挖矿和ethash
- Vim技能修炼教程(6)
- N!进制转化为10进制