软件需求请点击此处留言菜鸟资源为你准备 立即查看

第十五章:既有结构,为何引入联合,了解C/C++基本语言特性变量和类型【技术教程】

第十五章:既有结构,为何引入联合,了解C/C++基本语言特性变量和类型【技术教程】

  struct结构体是由一系列相同类型或不同类型的数据构成的数据集合。结构体也称结构。结构体的一般定义形式如下:   例如:   union 联合由几个不同的变量存放在同一块区域内,也就是覆盖技术,几个变量互相覆盖。union 联合的一般...

当前版本

软件大小

软件语言

是否破解

  struct结构体是由一系列相同类型或不同类型的数据构成的数据集合。结构体也称结构。结构体的一般定义形式如下:

  1. struct结构体名称
  2. {
  3.   成员表列
  4. }变量表列;

  例如:

  1. /*定义一个名称为 Person的结构体*
  2. struct Person
  3. {
  4.   char *pszName; /*Person的名称*/
  5.   Inti Sex; /*Person 的性别*/
  6. }Boy;//定义一个名称为Boy的变量

  union 联合由几个不同的变量存放在同一块区域内,也就是覆盖技术,几个变量互相覆盖。union 联合的一般定义形式如下:

  1. union结构体名称
  2. {
  3.   成员表列
  4. }变量表列;

  例如:

  1. /*在同一位置存放1字和2字节*/
  2. union WordToByte
  3. {
  4.   unsigned char Tbyte[2]; /*Tbyte[0]是Tword 的低字节*/
  5.   unsigned short Tword; /*Tbyte[1]是Tword 的高字节*/
  6. }Word;

  从定义形式上看,“联合”和“结构体”非常形似,但二者在本质上却有很大差异。首先,在结构体中每个成员都有自己的内存,一个结构体变量的总长度等于各个成员长度的总和。而在联合中,各个成员共享一段内存空间,一个联合变量的长度等于各个成员中长度最大的那个成员的长度。联合体对数据的引用与结构体对数据的引用方式相同,都必须通过联合或结构体中的元素引用,而不能引用联合体变量。

  例如,针对上述定义的联合体变量Word,下面的操作就是错误的:

  1. printf("%d",Word); <== 这种用法是错误的

  说明:联合体的共享不是指把各个成员同时装入一个联合体内,而是数据根据联合体的定义可以展现成不同的形式,同时向用户传递不同信息的过程。

  联合体一般有下述几个特点:

  ●同一个联合体可用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用。

  ●共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用

  ●共用体变量的地址和其各成员的地址都是同一地址。

  ●不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,并且也不能在定义共用体变量时对它进行初始化。

  ●不能把共用体变量作为函数参数,也不能作为函数的返回值,但可使用指向共用体变量的指针。

  ●共用体类型可出现在结构体类型的定义中,也可定义共用体数组;反之,结构体也可出现在共用体类型的定义中,数组也可作为共用体的成员。

  最后,我们来看一下联合体两种经典的应用场景:第一种是通过联合体判断操作系统或者CPU的特征;第二种是同样的数据采用不同的展现方式,会使获取的信息更清晰明了。

  首先看第一种:获取操作系统或者 CPU 的特征。我们经常会碰到这样的问题:在网络传输中数据都是采用大端传输的,而我们不知道服务器CPU 采用的格式是大端的还是小端的,在编写服务器处理程序时有时会遇到数据解析错误的现象,采用联合体可方便地获取CPU的大小端特征。

  1. union w
  2. {
  3.   int a: //4 bytes
  4.   char b; //1 byte
  5. }c;
  6. c.a=1;
  7. if(c.b==1)
  8. {
  9.   printf("此CPU是小端CPU\n");
  10. }
  11. Else
  12. {
  13.   printf("此CPU是大端CPU\n");
  14. }

  接着,我们将采用联合体实现数据的展示。同样以网络数据为例。在网络中数据都是以流的形式传输的,而当到达服务器时,数据流就会以不同的形式解析。典型的就是包头的解析。我们看一个链路层数据报头通过联合处理后数据的展示:

  1. //网络数据,全部是十六进制数据,不方便报文的分析和查看
  2. szData[]={
  3. 0x70,0x1a,0x04,0xae,0x2f,0x0f,0x40,0x16,0x9f,0xd6,0x62,0x8a,0x08,0x00,0x45,
  4. 0x00,0x00,0x2c,0x45,0x62,0x00,0x00,0x32,0x11,0xa4,0xa9,0xdb,0x8f,0x01,0x1a,
  5. 0xc0,0xa8,0x01,0x64,0xaa,0xd0,0x11,0x72,0x00,0x18,0x55,0x5b,0x4b,0x55,0x00,
  6. 0x01,0x04,0x000x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09
  7. };
  8. //链路层MAC数据报头的定义
  9. struct eth hdr
  10. {
  11.   struct eth addr dest; //目标MAC地址
  12.   struct eth addr src; //源MAC地址
  13.   u16_ttype; //类型
  14. }:
  15. union ETH_HDR //eth头联合体
  16. {
  17.   char*pszMacData:
  18.   eth hdr ethhdr;
  19. }
  20. ETH_HDR ethHDR:
  21. memset(&thMsg, 0, sizeof(ETH_HDR));
  22. ethHDR.pszMacData= szData; // szData代表网络上读取的数据

  通过 ethHDR.ethhdr.type 可方便地查看 MAC 报文头中的数据类型。

  请谨记

  联合体虽然和结构体长得很像,但两者还是有本质区别的,在使用时请区别对待。

第十五章:既有结构,为何引入联合,了解C/C++基本语言特性变量和类型【技术教程】
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

常见问题

  • 如何安装和激活?

    每款软件会附带有安装教程,您打开安装包一目了然

  • 程序是否已损坏?文件损坏?还是其他错误?

    有错误问题,请您参考:https://www.xxx.com/error

  • 如何更新?正式激活后会发生什么情况?

    除非安装说明中另有说明,否则官方更新可能会导致无法激活。 要从本网站更新软件,您需要在此处下载此软件的新版本(如果可用),并将其安装在计算机上安装的版本之上(替换)。在这种情况下,您将保存此软件的激活和设置。

  • 如何下载?链接不起作用?

    我们使用百度网盘,132云盘和微软网盘,除了百度网盘,其他两款不限速,如果链接失效,请您联系客服处理

  • 已发布更新。我什么时候升级我的版本?

    所有软件如有更新,我们第一时间推送,视自己情况更新使用

  • 如何更改语言?

    打开“系统偏好设置”->“通用>语言和地区”->应用程序-“+”。 选择应用和语言。此方法适用于大多数应用程序。 Adobe 产品中的语言通常是在产品本身的安装阶段选择的。 游戏中的语言通常会在游戏本身的设置中发生变化。

  • 如何删除软件?

    有很多选择。最简单的方法是使用特殊的实用程序来卸载应用程序,例如App Cleaner Uninstaller 要删除 Adobe 产品,请使用 Creative Cloud Cleaner Tool

  • 需要远程帮助吗?

    网站已开通永久会员的可享受免费远程,如果非永久会员,远程安装另外收费

技术教程

最新的百度蜘蛛baiduSpider IP大全教程分享(持续更新)SEO知识

2024-2-25 16:58:28

技术教程

第十六章:提防隐式转换带来的麻烦,了解C/C++基本语言特性变量和类型【技术教程】

2024-2-27 15:18:53

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
后退
榜单