概述
文章目录
- 结构体知识进阶
- 位域
- 存放函数指针
- 动态结构体的使用
结构体知识进阶
总所周知,结构体是C语言中重要的数据类型,可以存放多种不同类型的数据
结构体的一般用于存放类型不同但是又相互关联的数据,例如:一个人的身份信息包括姓名、性别、年龄和身份证号,这些数据需要由不同的数据类型存放,但是又都表示一个人的信息,这时一般会使用到结构体对该数据进行存储,但是结构体所能够支持的不止如此
接下来,我将介绍几种开发中常用的结构体的高级操作
位域
我们都知道,C语言中不包含bool类型,需要表示true或false时一般使用1和0表示
如果我们的结构体中有大量的bool类型的数据需要存放,我们就需要声明大量的int类型来存放这些数据,这样操作就会造成资源浪费,而位域可以很好的解决这个问题
概念
位域,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field)
使用实例如下:
#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;
}
程序运行结果如下:
The 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,这里就不再深究,毕竟笔者能力有限
存放函数指针
结构体中可以声明函数指针,将函数的返回值直接保存在结构体中
结构体中声明函数指针的类型,但是函数的具体实现需要自行编写,更重要的是,结构体中的类型并不是固定的,而是可以动态改变的
使用实例如下:
#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;
}
程序运行结果如下:
The res is: 2
The res is: 6
动态结构体的使用
结构体在编程开发中,是经常被使用的数据类型。在实际的开发中,有些结构体在声明的时候总是需要声明多种变量,但实际使用时并不总是需要全部使用
但是结构体的声明是静态的,即使结构体为空,它也仍要占据大量的空间,造成资源浪费。如果是发送数据且发送数据频率过高,就会占用大量带宽,影响系统的性能
问题示例
例如:一个客户端和服务器需要使用TCP进行数据交互,客户端向服务器发送点云数据;正常情况下,客户端只会发送一小部分的点云数据(少量的点的位置发生变化),只有在极少的情况下,才需要发送全部的数据(所有点的位置信息都更新)
但是在项目开发中,存放点云数据的结构体的大小是能够存放所有点数据的,这样就会造成每次发送给服务器的数据包的大小都是最大尺寸的,造成网络带宽占用极大
参考链接:https://blog.csdn.net/zhanshen112/article/details/80791622
动态结构体实例:
#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;
}
最后
以上就是机智花生为你收集整理的结构体知识进阶的全部内容,希望文章能够帮你解决结构体知识进阶所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复