#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class A
{
public:
A(){m_a=1;m_b=2;};
~A(){};
void fun(){printf("%d%d",m_a,m_b);}
public:
int m_a;
int m_b;
};
class B
{
public:
B(){m_c=3;};
~B(){};
void fun(){printf("%d",m_c);}
public:
int m_c;
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B *pb=(B*)(&a);
cout<<&a<<endl;
cout<<&(a.m_a)<<endl;
printf("%p\n",&A::m_a);
printf("%p\n",&A::m_b);
printf("%p\n",&B::m_c);
pb->fun();
return 0;
}
结果:![]()
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class A
{
public:
A(){m_a=1;m_b=2;};
~A(){};
void fun(){printf("%d%d",m_a,m_b);}
public:
int m_a;
int m_b;
};
class B
{
public:
B(){m_c=3;};
~B(){};
void fun(){printf("%d",m_c);}
public:
int m_c;
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B *pb=(B*)(&a);
cout<<&a<<endl;
cout<<&(a.m_a)<<endl;
printf("%p\n",&A::m_a);
printf("%p\n",&A::m_b);
printf("%p\n",&B::m_c);
pb->fun();
return 0;
}
%p 表示要输出的是地址。
在 A::a 之前有个引用符 & ,自然取得就是 A::a 对象的地址了。实例化得到对象,对象后有存储地址,所以A::a的写法就是偏移量。c语言中,有常用的几种格式符,%o输出八进制,%d输出十进制,%x输出十六进制,%f输出浮点型数据,%c输出单个字符,%s输出字符串,%l输出长整型。但是也有稍微不是很常用的格式符,%p就是其中之一。相信大家在日常中使用得比较少,其实它的输出格式也是六进制,跟%x的区别在于,%p输出的长度是一致的8位16进制符(即32位2进制符)。p 显示一个指针,near指针表示为:XXXX far 指针表示为:XXXX:YYYY