`
fp_moon
  • 浏览: 984048 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C/C+语言struct结构体的深层探索--转载

c 
阅读更多

 

1. struct的巨大作用

面对一个人的大型C/C++程序时,只看其对struct的使用情况,我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用struct,怎样用struct是区别一个开发人员是否具备丰富开发经历的标志。所以,struct对于我们学习C/C++编程的程序员来说是至关重要的,不可不知。

在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改。不要,为省小麻烦而成就以后的大麻烦。

一个有经验的开发者,则会灵活运用结构体,举一个例子,假设网络或控制协议中需要传送三种报文,其格式分别为packetX、packetY、packetZ:

struct structX
{
int a;
char b;
};

struct structY
{
char a;
short b;
};

struct structZ
{
int a;
char b;
float c;
}

优秀的程序设计者这样设计传送的报文:

struct CommuPacket
{
int iPacketType;  //报文类型标志
union      //每次传送的是三种报文中的一种,使用union
{
struct structX packetX;
struct structY packetY;
struct structZ packetZ;
}
};

在进行报文传送时,直接传送struct CommuPacket一个整体。

假设发送函数的原形如下:

// pSendData:发送字节流的首地址,iLen:要发送的长度
Send(char * pSendData, unsigned int  iLen);
发送方可以直接进行如下调用发送struct CommuPacket的一个实例sendCommuPacket:
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
假设接收函数的原形如下:
// pRecvData:发送字节流的首地址,iLen:要接收的长度
//返回值:实际接收到的字节数
unsigned int Recv(char * pRecvData, unsigned int  iLen);

接收方可以直接进行如下调用将接收到的数据保存在struct CommuPacket的一个实例recvCommuPacket中:

Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );

接着判断报文类型进行相应处理:

switch(recvCommuPacket. iPacketType)
{
case PACKET_X:
…    //X类报文处理
break;
case PACKET_Y:
…   //Y类报文处理
break;
case PACKET_Z:
…   //Z类报文处理
break;
}

以上程序中最值得注意的是

Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );

中的强制类型转换:(char *)&sendCommuPacket、(char *)&recvCommuPacket,先取地址,再转化为char型指针,这样就可以直接利用处理字节流的函数。

利用这种强制类型转化,我们还可以方便程序的编写,例如要对sendCommuPacket所处内存初始化为0,可以这样调用标准库函数memset():

memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));

 

分享到:
评论

相关推荐

    结构体-c-struct-test-8-19.rar

    结构体-c-struct-test_8_19.rar

    结构体-struct-test-8-20.rar

    结构体-struct-test_8_20.rar

    sizeof求struct结构体内存大小的问题

    当应用于`struct`结构体时,它会返回整个结构体占据的总字节数,这涉及到内存对齐的问题。内存对齐是编译器为了提高数据访问效率而采取的一种策略,它规定了不同类型的数据在内存中的存储方式和位置。 首先,我们来...

    多语言环境下结构体的定义与应用详解-C/C++/Python/Java结构体实现对比

    内容概要:本文详细介绍了结构体这一用户自定义数据类型的定义与使用方法,分别展示了其在 C、C++、Python 和 Java 四种编程语言中的表现形式及其特点。C语言使用struct关键字来定义并管理相关数据;C++继承了这一...

    C/C++中结构体(struct)知识点强化

    在C/C++编程语言中,**结构体(struct)**是一种用户自定义的数据类型,它允许开发者将不同类型的变量组合在一起形成一个单一的实体。这为解决复杂问题提供了极大的灵活性。例如,我们可能需要创建一个学生记录,其中...

    详解C语言Struct(结构体)系列之一

    C语言中的结构体(Struct)是一种用户定义的数据类型,允许将不同类型的数据项聚集在一起构成一个单一类型。结构体在C语言中扮演着极其重要的角色,它使得程序员可以创建复杂的自定义数据结构,以更贴近现实世界的...

    C 语言嵌入式系统编程修炼

    C/C+语言 struct 深层探索 C++中 extern "C"含义深层探索 C 语言高效编程的几招 想成为嵌入式程序员应知道的 0x10 个基本问题 C 语言嵌入式系统编程修炼 C 语言嵌入式系统编程修炼之一:背景篇 C 语言嵌入式系统编程...

    Android/Java基于Socket接收结构体数据

    在Android和Java开发中,有时候我们需要处理C/C++风格的结构体数据,特别是在与底层通信或者跨平台项目中。在这种情况下,Javolution库提供了一个强大的解决方案,它允许我们在Java中方便地操作结构体数据。本文将...

    408结构体对齐-typedef-结构体指针-c++引用

    ### 结构体对齐、typedef、结构体指针与C++引用详解 #### 一、结构体对齐 **结构体对齐**是指在结构体中的成员变量在内存中的排列方式,这种排列是为了提高CPU访问内存的速度。由于现代处理器的设计倾向于以一定的...

    详解C++程序中定义struct结构体的方法

    在C++编程语言中,结构体(struct)是C语言中的概念被继承过来的,它允许用户将不同的数据类型组合成一个单一的复合类型。C++中的结构体不仅可以包含不同数据类型的成员,而且可以拥有成员函数,这在C语言中是不支持的...

    结构体变量引用-数组-指针

    //自定义结构体类型 struct date { int month; //结构体变量名定义 int day; int year; }; struct teacher { int num; char name[20]; struct date birthday; //结构体的嵌套定义 int salary; char addr[30]...

    C语言程序设计C语言程序设计02-指针与结构体_6_6.pptx

    【C语言程序设计:指针与结构体】 在C语言中,指针是编程中一个非常重要的概念,它能够存储变量的内存地址,允许我们直接访问和修改存储在特定地址的值。当涉及到复杂的结构,如结构体,指针的作用就更加显著了。...

    结构体的使用c语言练习题

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个新的类型。这种新类型可以包含整型、浮点型、字符型等基本类型,甚至是其他结构体类型。结构体在处理复杂数据时非常有用...

    一种快速清空结构体的方法

    先自定义一个结构体,比如: struct Table{short int a;long b;short intc;long d;};struct Table Tab[10]; 以下的函数即是用于清空结构体的,需要传入的两个参数分别为结构体的起始地址和结构体的长度。 ...

    结构体的使用-你了解多少?

    结构体是C语言中的重要组成部分,它能够让C语言组合得更清晰明了。结构体是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。 一、结构体的定义 ...

    C/C++语言中结构体的全面解析及其在嵌入式与系统编程的应用

    内容概要:本文深入介绍了 C/C++ 语言中的结构体(struct),一种能够将多种不同类型的元素整合为单个单元的数据类型。首先讲述了怎样利用关键字 ‘struct’ 对一个包含品牌、年份以及价格信息的汽车进行定义,紧...

    C结构体和链表 - 简书1

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将不同类型的数据组合在一起作为一个整体来处理。本文主要探讨了结构体的定义、初始化、无名结构体、宏定义结构体以及结构体的嵌套。 一、结构体变量...

    图书管理系统c语言

    struct tushu //图书信息的结构体 { int num; //编号 char bookname[20]; //书名 char name[30]; //作者名 char fenlei[20]; //分类号 char put_unit[50]; //出版单位 int time; //出版时间 int shuliang; //...

    C语言结构体实现方法

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体。这使得我们能够以更模块化和组织化的方式处理数据。本篇将详细介绍C语言中结构体的实现方法以及规范的编码...

    golang struct 自动生成工具

    一,生成数据库所有表结构体: ①推荐使用方法(支持linux或mac) 生成命令:./ bin / auto -d dbname -path ./models ②修改生成工具代码(支持linux或mac或windows)如果生成出来的结构不是我们所需要的可以...

Global site tag (gtag.js) - Google Analytics