结构体知识进阶

结构体知识进阶

总所周知,结构体是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: %d\n",sizeof(res));
	printf("The RES.true is: %d\n",RES.true);
	printf("The RES.false is: %d\n",RES.false);

	printf("The size result is: %d\n",sizeof(bool));
	printf("The result.true is: %d\n",result.true);
	printf("The result.false is: %d\n",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: %d\n",T.func(1,1));

		T.func = mul;
		printf("The res is: %d\n",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 %d\n",pData->num);
		for (i = 0; i<len; i++)
    {   
        printf("The pData[%d].val is %d\n",i,pData->t[i].val);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章