我是靠谱客的博主 机智花生,最近开发中收集的这篇文章主要介绍结构体知识进阶,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 结构体知识进阶
        • 位域
        • 存放函数指针
        • 动态结构体的使用

结构体知识进阶

总所周知,结构体是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;
}

最后

以上就是机智花生为你收集整理的结构体知识进阶的全部内容,希望文章能够帮你解决结构体知识进阶所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部