- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++从零开始——何谓结构.pdf
C++从零开始——何谓结构 前篇已经说明编程时,拿到算法后该干的第一件事就是把资源映射成数字,而前面也说过“类 型就是人为制订的如何解释内存中的二进制数的协议”,也就是说一个数字对应着一块内存 (可能4 字节,也可能20 字节),而这个数字的类型则是附加信息,以告诉编译 器当发现有对那块内存的操作语句(即某种操作符)时,要如何编写机器指令以实现那 个操作。比如两个char类型的数字进行加法操作符操作,编译器编译出来的机器指令就和 两个long 类型的数字进行加法操作的不一样,也就是所谓的“如何解释内存中的二进制数的 协议”。由于解释协议的不同,导致每个类型必须有一个唯一的标识符以示区别,这正好可 以提供强烈的语义。 typedef 提供语义就是要尽可能地在代码上体现出这句或这段代码在人类世界中的意义,比如前 篇定义的过河方案,使用一char类型来表示,然后定义了一数组charsln[5]以期从变量名上 体现出这是方案。但很明显,看代码的人不一定就能看出sln 是solution 的缩写并进而了解 这个变量的意义。但更重要的是这里有点本末倒置,就好像这个东西是红苹果,然后知道 这个东西是苹果,但它也可能是玩具、CD 或其它,即需要体现的语义是应该由类型来 体现的,而不是变量名。即char无法体现需要的语义。 对此,C++提供了很有意义的一个语句--类型定义语句。其格式为typedef 源类型名 标识符;。其中的源类型名表示已存在的类型名称,如char、unsigned long 等。而标识 符就是程序员随便起的一个名字,符合标识符规则,用以体现语义。对于上面的过河方案, 则可以如下: typedefcharSolution; Solution sln[5]; 上面其实是给类型char起了一个别名Solution,然后使用Solution 来定义sln 以更好地 体现语义来增加代码的可读性。而前篇将两岸的人数分布映射成char[4],为了增强语义, 则可以如下: typedefcharPersonLayout[4];PersonLayout oldLayout[200]; 注意上面是typedefcharPersonLayout[4];而不是typedefchar[4]PersonLayout;,因为数组 修饰符“[]”是接在被定义或被声明的标识符的后面的,而指针修饰符“*”是接在前面的,所以 可以typedefchar*ABC[4];但不能typedef char[4]ABC*;,因为类型修饰符在定义或声明语句 中是有固定位置的。 上面就比charoldLayout[200][4];有更好的语义体现,不过由于为了体现语义而将类型名 或变量名增长,是否会降低编程速度?如果编多了,将会发现编程的大量时间不是花在敲代 码上,而是调试上。因此不要忌讳书写长的变量名或类型名,比如在Win32 的Security SDK 中,就提供了下面的一个函数名: BOOLConvertSecurityDescriptorToStringSecurityDescriptor(…); 很明显,此函数用于将安全描述符这种类型转换成文字形式以方便人们查看安全描述符 中的信息。 应注意typedef不仅仅只是给类型起了个别名,还创建了一个原类型。当书写char*a,b; 时,a 的类型为char*,b 为char,而不是想象的char*。因为“*”在这里是类型修饰符,其是 独立于声明或定义的标识符的,否则对于chara[4],b;,难道说b是char[4]?那严重不符合 人们的习惯。上面的char就被称作原类型。为了让char*为原类型,则可以:typedef char *PCHAR; PCHAR a, b,*c[4];。其中的a 和b 都是char*,而c 是char**[4],所以这样也就没 有问题:char**pA= a;。 结构 再次考虑前篇为什么要将人数布局映射成char[4],因为一个人数可以用一个char就表 示,而人数布局有四个人数,所以使用 char[4]。即使用char[4]是希望只定义一个变量就代 表了一个人数分布,编译器就一次性在栈上分配4 个字节的空间,并且每个字节都各自代表 一个人数。所以为了表现河岸左侧的商人数,就必须写a[0],而左侧的仆人数就必须a[1]。 坏处很明显,从a[0]无法看出它表示的是左岸的商人数,即这个映射意义(左岸的商人数映 射为内存块中第一个
文档评论(0)