网站大量收购闲置独家精品文档,联系QQ:2885784924

《程序设计与C语言》课件第8章.ppt

  1. 1、本文档共245页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

从执行结果可以看出,当以中序遍历二叉树时,输出的结果是有序的,这是因为在插入操作时把比根结点小的数插在了左子树,把比根结点大的数插在了右子树。另外在插入二叉树的过程中,把重复的数据都过滤掉了。8.3共用体程序中的变量有两种情况:一种是变量之间互不相关,都有自己的名字和存储空间;另一种是变量之间是相关的,它们虽然有各自的名字,但共用同一段内存空间,即让这段空间轮流地为它们服务,这样就可以减少空间的浪费。让这些变量共用同一内存空间的方法是把它们组织成共用体。共用体是一种新的数据类型,它的定义与结构体的定义相似,具体为:union〈共用体名〉{成员列表};例如:unionnumber{intx;floaty;charc;};在这个共用体类型中定义了三个分量,它们的类型各不相同,但都占用同一内存空间。由于各个分量的类型不同,因此这段空间应足够大,以便能放下最大的分量,所以这个共用体要占用4个字节空间,因为其中的分量y是float类型,是最长的类型,占4字节,如图8-27所示。图8-27共用体对内存空间的占用定义共用体变量的方法和定义结构体变量的方法一样。例如语句 unionnumbera,b,c,*p=a;就定义了3个共用体变量a,b,c和一个共用体指针p且让它指向共用体变量a,实际上是指向该变量的起始地址。从图8-25中可以看出,共用体中各分量在同一空间中的存放不是随意的,而是都从该空间的起始处开始存放,因而各分量都有相同的起始地址,并且都和共用体变量的地址相同,即:a.x=a.y=a.c=a(共用体分量的引用和结构体分量的引用相同,都是通过点运算符进行的)。因共用体指针是指向共用体起始位置的,所以也是指向各成员的。但是共用体指针不能直接引用各分量,因为各分量的类型不同,它们与共用体的类型也不同,而指针是有类型的。为使指向共用体的指针为各分量所用,必须进行强制类型转换。例如:*p=′a′; /*错误!*/*(char*)p=′a′; /*正确*/同样可以用p指针引用分量x和y:*(int*)p=100;*(float*)p=3.1416;共用体变量也可以赋初值,但对它赋初值的方法和对结构体变量赋初值的方法不同。结构体变量可以给各个分量同时赋初值,但共用体变量一次只能给其中一个分量赋初值。例如:unionnumberv={3}; /*正确*/unionnumberu={3.1416,′c′} /*错误*/同类型的共用体变量之间可以互相赋值,但共用体变量不能和其他类型的变量之间进行赋值。例如: b=a;是可以的。但若有:inti;floatf;则 i=a;、a=i;及f=a;等都是非法的。任何时候共用体变量中只有一个分量类型的数据,如以其他分量的类型来存取,可能会出现不正确的结果。【例8-14】分析下面程序的输出结果。#includestdio.hmain(){unionnumber{inti;longl;}a;a.i=-32768;printf(″int:%d,long:%ld\n″,a.i,a.l);a.l=65536;printf(″int:%d,long:%ld\n″,a.i.,a.l);return0;}运行输出:int:-32768,long:32768int:0,long:65536为什么会有这样的结果呢?我们可以这样来分析:我们已经知道,共用体的各个分量都有一个相同的地址,即共用体的起始地址,这个起始地址也就是它们最低位的地址,因此共用体变量a的构成示意图为:当执行赋值语句a.i=-32768;之后,内存形式为:即-32768的补码表示形式,但对长整型分量a.l而言,这只是在它的低16位,它仍然是个正数,其结果就是32768。同样,当执行赋值语句a.l=65535;之后,内存形式为:它的低16位全部是0,于是在a.i看来也就是0。【例8-15】已知字符′0′的ASCII码值为十六进制的30,分析下面程序的运行结果。#includestdio.hmain(){union{unsignedcharc;unsi

文档评论(0)

酱酱 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档