设为首页 加入收藏

TOP

C++从零开始(九)――何谓结构(二)
2014-11-24 13:20:08 】 浏览:1854
Tags:从零 开始 何谓 结构
0、4、8、24正好等同于a、b、c、d顺次安放在内存中所形成的偏移,这也正是struct这个关键字的修饰作用,也就是前面所谓的各定义的变量之间是串行关系。
为什么要给偏移制订映射?即为什么将a映射成偏移0字节,b映射成偏移4字节?因为可以给偏移添加语义。前面的“左岸的商人数映射为内存块中第一个字节的内容以补码格式解释”其实就是给定内存块的首地址偏移0字节。而现在给出一个标识符和其绑定,则可以将这个标识符起名为LeftTrader来表现其语义。
由于上面定义的变量都是偏移类型,根本没有分配内存以和它们建立映射,它们也就很正常地不能是引用类型,即struct AB{ long a, &b; };将是错误的。还应注意上面的类型double (ABC::)[2],类型修饰符“ABC::”被用括号括起来,因为按照从左到右来解读类型操作符的规则,“ABC::”实际应该最后被解读,但其必须放在标识符的左边,就和指针修饰符“*”一样,所以必须使用括号将其括住,以表示其最后才起修饰作用。故也就有:double (*ABCD::)[2]、double (**ABCD::)[2],各如下定义:
struct ABCD { double ( *pD )[2]; double ( **ppD )[2]; };
但应注意,“ABCD::”并不能直接使用,即double ( *ABCD:: pD )[2];是错误的,要定义偏移类型的变量,必须通过类型定义符“{}”来自定义类型。还应注意C++也允许这样的类型double ( *ABCD::* )[2],其被称作成员指针,即类型为double ( *ABCD:: )[2]的指针,也就是可以如下:
double ( **ABCD::*pPPD )[2] = &ABC::ppD, ( **ABCD::**ppPPD )[2] = &pPPD;
上面很奇怪,回想什么叫指针类型。只有地址类型的数字才能有指针类型,表示不计算那个地址类型的数字,而直接返回其二进制表示,也就是地址。对于变量,地址就是它映射的数字,而指针就表示直接返回其映射的数字,因此&ABCD::ppD返回的数字其实就是偏移值,也就是4。
为了应用上面的偏移类型,C++给出了一对操作符――成员操作符“.”和“->”。前者两边接数字,左边接自定义类型的地址类型的数字,而右边接相应自定义类型的偏移类型的数字,返回偏移类型中给出的类型的地址类型的数字,比如:a.ABC::d;。左边的a的类型是ABC,右边的ABC::d的类型是double ABC::,则a.ABC::d返回的数字是double的地址类型的数字,因此可以这样:a.ABC::d = 10.0;。假设a对应的地址是3000,则a.ABC::d返回的地址为3000+24=3024,类型为double,这也就是为什么ABC::d被叫做偏移类型。由于“.”左边接的结构类型应和右边的结构类型相同,因此上面的ABC::可以省略,即a.d = 10.0;。而对于“->”,和“.”一样,只不过左边接的数字是指针类型罢了,即b->c[1] = 10.0;。应注意b->c[1]实际是( b->c )[1],而不是b->( c[1] ),因为后者是对偏移类型运用“[]”,是错误的。
还应注意由于右边接偏移类型的数字,所以可以如下:
double ( ABC::*pA )[2] = &ABC::c, ( ABC::**ppA )[2] = &pA;
( b->**ppA )[1] = 10.0; ( a.*pA )[0] = 1.0;
上面之所以要加括号是因为数组操作符“[]”的优先级较“*”高,但为什么
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++从零开始(十)――何谓类 下一篇C++从零开始(十一)(下)――类..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目