C++语法关于指针的问题

来源:百度知道 编辑:UC知道 时间:2024/05/24 10:43:52
V1,V2是两个自定义的类:下面是调用的代码
帮我解释一下每行代码都是什么意思。
V2 v2;
V1 v1;
v2.m_vtbl=*(DWORD_PTR*)&v1;
//DWORD_PTR是一个四字节的内存地址,类似于int
*(V1*)&v2=v1;
(*(V1*)&v2).show();
(*(V1*)&v2).DoShow();
V1,V2是两个自定义的类,就当他们已经定义好了。

就算是已经定义好的类也不知道你里面的成员是什么啊。
v2.m_vtbl=*(DWORD_PTR*)&v1;//估计m_vtbl是一个DWORD型,或者指针,
*(DWORD_PTR*)&v1其实就是取得v1对象首地址,如果v1是一个具有多态的类的话,那v1的首地址也就是他的虚函数表首地址。
*(V1*)&v2=v1;//效果是将v2地址改成v1的地址
&v2去v2对象地址,(V1*)&v2强制转换成v1类型指针,*(V1*)&v2:相当于一个v1对象
(*(V1*)&v2).show();如果v2是继承至v1,并且show是虚函数,那么这句将会调用v2的show()而不管被转换成什么类型,因为v2指向的对象是v2类型的。不然的话就会调用v1的show()

V2 v2; //定义V2类型的变量
V1 v1; //定义V1类型的变量

/* 取v1的地址,转换为指向DWORD_PTR类型的指针,使用*号解引用此指针,将的值(此值应该就是DWORD_PTR类型的)赋值给v2的成员变量m_vtbl */
v2.m_vtbl=*(DWORD_PTR*)&v1;

/* 实际上将v1的值赋值给v2所在的空间,原理与上面一样,是通过指针进行转换的,因为v1和v2不是一样的类型,所以v2=v1是不可以的,那么我们可以讲但是将v2进行强制转换有不对,因为强制转换得到的仅仅是转换之后的一个值而已,是不可以当左值的,所以我们可以使用指针将v2所在的控件转换为刻意容纳v1类型的空间,在赋值。 */
*(V1*)&v2=v1;

/*现在就清楚了,经过上面的步骤,v2所在的空间现在存放的数据实际上是v1的数据,所以这里将其再次进行强制转换之后,调用v1的方法show()*/
(*(V1*)&v2).show();
/* 调用v1的方法DoShow() */
(*(V1*)&v2).DoShow();

总的来说,这样的程序没有任何意义,这样对空间进行强制转换之后赋值很容易使程序出现错误,如果v1和v2占用的内存大小不一样的话,例如v1类型占用10个字节,v2类型占用100个字节,那么将