这里写自定义目录标题
C++中指针类型转换
阅读C++ 对象内存模型详解时,期间有一个例子令我十分不解,于是亲手实践后方得真知,感谢阳明知行合一之说。
代码
class Base
{
public:
Base(int i) :baseI(i) {}
virtual void print(void) { cout << "Base::print()"; };
virtual void setI() { cout << "Base::setI()"; };
virtual ~Base() {};
private:
int baseI;
};
int main() {
Base b(1000);
Base* tmp = &b;
int* vtprAdree = (int*)(&b);
cout << "虚函数表指针(vtptr)的地址是:\t" << vtprAdree << endl;
float a = 0.11f;
float* p = &a;
cout << p << endl;
system("pause");
return 0;
}
说明
以上代码中虽然tmp 的值和vtprAdree 值在数值上是相等的,都是b对象的首地址,但是 * tmp 返回的是一个Base对象,而 * vtprAdree 返回的是该地址中存储的值
.具体调试结果如下,一目了然:
因此
int* vtprAdree = (int*)(&b);
因此这里相当于将一个Base类型的指针强转为int类型的指针,虽然指针存储的值是一样的,但是取*后代表的意义不相同,这点需要注意
。