vb6.0中表示带二级地址加偏移量和三级地址加偏移量,具体邮箱格式怎么写写,有没有实际的例子?

& 成员在类中的偏移量 & 类成员指针
成员在类中的偏移量 & 类成员指针
文章作者:Yx.Ac
& 文章来源:勇幸|Thinking ()
& 转载请注明,谢谢合作。
看一道笔试题(引自):写出程序输出结果
#include &stdio.h&
A() {m_a = 1; m_b = 2;}
void fun() {printf(&%d %d&, m_a, m_b);}
B() {m_c = 3;}
void fun() {printf(&%d&, m_c);}
void main()
B *pb = (B*)(&a);
pb-&fun();
程序的输出结果为1。
暂且不讨论该程序设计有多么糟糕,但程序主要考察关于类对象成员调用的机制,关于这方面,据说在《》中有详解,我没有做深入研究,只是根据看《》和《》中的一些知识说一下自己的理解。
这里主要涉及到两方面:一是对象调用成员函数时会将调用对象与函数绑定;二是对象访问成员是根据该成员距离对象的偏移量来访问的,而不是根据成员名来访问,所谓偏移量,就是告诉你一个特定的成员位置距离对象的起点有多少个字节。
上面程序,内存中实例化了一个A类对象,然后将该地址强制转换成一个B类地址,即将该对象的地址内容强制看成一个B类对象。pb为B类的指针,理所当然调用的是B类中的fun()函数(可以跟多态的情形相比较),当调用fun()函数时,调用对象与该函数进行绑定,即fun()函数中隐含的形参this指针初始化为调用对象(A类对象)的地址,假设为0xff80。然后fun()函数打印值m_c。这里要注意,对象在访问类成员时,编译器并没有存储该对象各个成员的实际地址,而是存储了其相对于当前对象首地址的偏移量,由于B类只有一个成员m_c,在编译阶段,编译器就记录了m_c对于B类对象的偏移量为0,故访问m_c时,便是访问当前对象地址this+偏移量0,注意,this在这里绑定的是A类对象的首地址,在A类中,偏移量为0的成员是m_a,故打印出m_a的值。
关于类成员偏移量的输出,可以用程序验证。
例如如下程序:将地址0强制转换为A类对象的地址,那么打印类成员m_a和m_b的地址便是他们的偏移量,如下分别输出0, 4。
cout&&&((A*)0)-&m_a&&
cout&&&((A*)0)-&m_b&&
再如,我们可以通过输出类成员指针来验证。
printf(&%p\n&,&A::m_a);
printf(&%p\n&,&A::m_b);
分别输出 000004。
如程序,&A::m_a实际是一个指向int型的A类的成员指针,用m_a初始化,即相当于:
int A::*ptr = &A::m_a;
这里说一下,输出成员指针的值,最好使用printf,%p输出指针,我曾试图使用语句
cout&&&A::m_a&&&A::m_b;
结果全是1。
究其原因,应该是ostream对象没有重载类成员指针的参数,故不能直接输出类成员指针的类型,而我们知道指针类型与bool类型的转换属于标准转换的(常常用来测试指针合法性是否为空),而ostream对象可以输出bool类型,故编译器将成员指针类型转换成了bool类型,从而输出,既然这样为什么全是输出1呢?说明地址全是合法的,即偏移量全是大于0,不对呀,第一个类成员的偏移量不是0么,这里真心不明白,不过《》中有这样一句话:大多数编译器都将成员指针实现为一个整数,包含被指向成员的偏移量,另外加上1(加1是为了让值0可以表示一个空的数据成员指针)。这大概就是全输出1的原因了吧。
关于成员指针
成员指针只是记录一个成员的偏移量,而非地址,因为类中没有地址,选择一个类的成员只是意味着在类中偏移,只有把这个偏移和具体对象的首地址结合,才能得到实际地址。
成员指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向一个特定对象的特定成员,最直接的理解是将其理解为一个偏移量。这个偏移量适用于某一类A的任何对象,换言之,如果一个A类对象的成员a距离起点的偏移量是4,那么任何其他A类对象中,a的偏移都是4字节。
啰嗦一大堆,总结一下就是两句话:
类对象访问其成员时,是根据该成员在类中的偏移量来访问的。
类成员指针,可以理解为指向类数据成员的一个偏移量,而非地址。
(全文完)
点击鼠标喂喂小老鼠吧
- 26,979 views - 26,218 views - 22,657 views - 20,438 views - 19,590 views - 19,360 views - 18,591 views - 17,468 views - 14,454 views - 14,380 views - 13,262 views - 13,243 views - 12,335 views - 11,736 views - 11,355 views - 11,274 views - 11,234 views - 11,010 views - 9,906 views - 9,817 views - 9,660 views - 9,638 views - 9,624 views - 9,387 views - 9,353 views - 9,322 views - 9,027 views - 8,865 views - 8,795 views - 8,530 views - 8,457 views - 8,441 views - 8,434 views - 8,351 views - 7,859 views - 7,780 views - 7,569 views - 7,246 views - 7,177 views - 7,162 views - 7,006 views - 6,276 viewsB分析:熟记我国的三级行政区划是解题的关键;解答:根据题干中提示可知其中包含的行政单位有省、县、镇三个;我国的三级行政区划为省(自治区、直辖市)、县(自治县、县级市)、镇(乡)三级;故选:B.点评:本题主要考查了我国的行政区划,属于基础题,学生应牢记相关基础知识.
请在这里输入关键词:
科目:初中地理
图中信封上的收信人地址表示的区域有几级?(  )
A、2级B、3级C、4级D、5级
科目:初中地理
图中信封上的收信人地址表示的区域有几级(  )A.2级B.3级C.4级D.5级
科目:初中地理
来源:不详
题型:单选题
图中信封上的收信人地址表示的区域有几级(  )A.2级B.3级C.4级D.5级
精英家教网新版app上线啦!用app只需扫描书本条形码就能找到作业,家长给孩子检查作业更省心,同学们作业对答案更方便,扫描上方二维码立刻安装!用段基址:偏移量形式表示的内存地址,怎么计算物理地址_汇编吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:29,700贴子:
用段基址:偏移量形式表示的内存地址,怎么计算物理地址收藏
近日龙人计算机推出单片机程序100%精准反汇编技术服务,反汇编出来的程序代码可以编译成和原来一模一样的BIN文件或HEX文件等烧录文件形式,反汇编周期短,仅需1-3天.
段值x 10h +偏移如物理地址=1H=179B8H
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或找到游戏里的基址和偏移量后,怎么计算出二级地址?_百度知道若逻辑地址中页内偏移量用12bit来表示,则该系统页框大小是多少
逻辑地址中页内偏移量用12bit来表示,则该系统页大小最大可以是2^12=4096,即每页4K。
为您推荐:
扫描下载二维码}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信