文章目录
- 结构体知识进阶
- 位域
- 存放函数指针
- 动态结构体的使用
结构体知识进阶
总所周知,结构体是C语言中重要的数据类型,可以存放多种不同类型的数据
结构体的一般用于存放类型不同但是又相互关联的数据,例如:一个人的身份信息包括姓名、性别、年龄和身份证号,这些数据需要由不同的数据类型存放,但是又都表示一个人的信息,这时一般会使用到结构体对该数据进行存储,但是结构体所能够支持的不止如此
接下来,我将介绍几种开发中常用的结构体的高级操作
位域
我们都知道,C语言中不包含bool类型,需要表示true或false时一般使用1和0表示
如果我们的结构体中有大量的bool类型的数据需要存放,我们就需要声明大量的int类型来存放这些数据,这样操作就会造成资源浪费,而位域可以很好的解决这个问题
概念
位域,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field)
使用实例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <stdio.h> typedef struct { int true; int false; }res; typedef struct { unsigned int true : 1; unsigned int false : 1; }bool; int main() { res RES; RES.true = 1; RES.false = 0; bool result; result.true = 1; result.false = 0; printf("The size of RES is: %dn",sizeof(res)); printf("The RES.true is: %dn",RES.true); printf("The RES.false is: %dn",RES.false); printf("The size result is: %dn",sizeof(bool)); printf("The result.true is: %dn",result.true); printf("The result.false is: %dn",result.false); return 0; }
程序运行结果如下:
1
2
3
4
5
6
7The size of RES is: 8 The RES.true is: 1 The RES.false is: 0 The size result is: 4 The result.true is: 1 The result.false is: 0
这里涉及到一些计算机底层存储机制,例如数据的符号位等存储细节,导致bool类型的长度并不是2,这里就不再深究,毕竟笔者能力有限
存放函数指针
结构体中可以声明函数指针,将函数的返回值直接保存在结构体中
结构体中声明函数指针的类型,但是函数的具体实现需要自行编写,更重要的是,结构体中的类型并不是固定的,而是可以动态改变的
使用实例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <stdio.h> typedef struct { int(*func)(int a,int b); }test; int add(int x,int y) { return x+y; } int mul(int x,int y) { return x*y; } int main() { test T; T.func = add; printf("The res is: %dn",T.func(1,1)); T.func = mul; printf("The res is: %dn",T.func(2,3)); return 0; }
程序运行结果如下:
1
2
3The res is: 2 The res is: 6
动态结构体的使用
结构体在编程开发中,是经常被使用的数据类型。在实际的开发中,有些结构体在声明的时候总是需要声明多种变量,但实际使用时并不总是需要全部使用
但是结构体的声明是静态的,即使结构体为空,它也仍要占据大量的空间,造成资源浪费。如果是发送数据且发送数据频率过高,就会占用大量带宽,影响系统的性能
问题示例
例如:一个客户端和服务器需要使用TCP进行数据交互,客户端向服务器发送点云数据;正常情况下,客户端只会发送一小部分的点云数据(少量的点的位置发生变化),只有在极少的情况下,才需要发送全部的数据(所有点的位置信息都更新)
但是在项目开发中,存放点云数据的结构体的大小是能够存放所有点数据的,这样就会造成每次发送给服务器的数据包的大小都是最大尺寸的,造成网络带宽占用极大
参考链接:https://blog.csdn.net/zhanshen112/article/details/80791622
动态结构体实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define LEN sizeof(Data) typedef struct { int val; }test; typedef struct { int num; test t[]; } Data; int main() { int len, i; Data *pData; printf("请输入test结构体的个数:n"); scanf("%d", &len); pData = (Data*)malloc(LEN+sizeof(test)*(len-1)); printf("请输入Data结构体的值:"); scanf("%d",&(pData->num)); for (i = 0; i<len; i++) { printf("请输入pData->t[%d].val 的值n",i); scanf("%d", &pData->t[i].val); } printf("The Data.num is %dn",pData->num); for (i = 0; i<len; i++) { printf("The pData[%d].val is %dn",i,pData->t[i].val); } return 0; }
最后
以上就是机智花生最近收集整理的关于结构体知识进阶的全部内容,更多相关结构体知识进阶内容请搜索靠谱客的其他文章。
发表评论 取消回复