#include <iostream>
using namespace std;
class MYACLS
{
public:
int m_i;
int m_j;
int m_k;
};
void myfunc(int MYACLS::* mempoint, MYACLS& obj)
{
obj.*mempoint = 260; //注意寫法
}
int main()
{
//一:對象成員變量記憶體位址及其指針
MYACLS myobj;
myobj.m_i = myobj.m_j = myobj.m_k = 0;
printf("myobj.m_i = %p\n", &myobj.m_i); //對象的成員變量是有真正的記憶體位址的;
MYACLS* pmyobj = new MYACLS();
printf("pmyobj->m_i = %p\n", &pmyobj->m_i);//同上
printf("pmyobj->m_j = %p\n", &pmyobj->m_j);
int* p1 = &myobj.m_i;
int* p2 = &pmyobj->m_j;
*p1 = 15;
*p2 = 30;
printf("p1位址=%p,p1值=%d\n", p1, *p1);
printf("p2位址=%p,p2值=%d\n", p2, *p2);
//二:成員變量的偏移值及其指針(和具體對象是沒有關系的)
cout << "列印成員變量偏移值----------------" << endl;
printf("MYACLS::m_i偏移值 = %d\n", &MYACLS::m_i); //列印偏移值,這裡用的%d
printf("MYACLS::m_j偏移值 = %d\n", &MYACLS::m_j);
//用成員變量指針來列印偏移值也可以,看寫法
//大家要知道,成員變量指針裡邊儲存的 實際上是個偏移值(不是個實際記憶體位址)。
int MYACLS::* mypoint = &MYACLS::m_j;
cout << typeid(mypoint).name() << sizeof(mypoint)<<endl;
//cout << sizeof(a) << endl;
printf("MYACLS::m_j偏移位址 = %d\n", mypoint);
mypoint = &MYACLS::m_i; //這裡注意,單獨使用時直接用名字,定義時才需要加MYACLS::
printf("MYACLS::m_i偏移位址 = %d\n", mypoint);
//三:沒有指向任何資料成員變量的指針
//通過 一個對象名或者對象指針後邊跟 成員變量指針 來通路某個對象的成員變量:
myobj.m_i = 13;
myobj.*mypoint = 22;
pmyobj->*mypoint = 19;
myfunc(mypoint, myobj);
myfunc(mypoint, *pmyobj);
cout << "sizeof(mypoint) =" << sizeof(mypoint) << endl; //也是個4位元組;
int* ptest = 0;
int MYACLS::* mypoint2;
mypoint2 = 0; //成員變量指針
//mypoint2 = NULL; //0xffffffff
printf("mypoint2 = %d\n", mypoint2);
int MYACLS::* mypoint10 = &MYACLS::m_i;
if (mypoint == mypoint10) //成立的
{
cout << "成立" << endl;
}
//以下3行不通過
//mypoint2 += 1;
//mypoint2++;
//mypoint2 = ((&MYACLS::m_i) + 1);
/*
myobj.m_i = 0000004D28BEFA98
pmyobj->m_i = 0000020D5E64F7A0
pmyobj->m_j = 0000020D5E64F7A4
p1位址=0000004D28BEFA98,p1值=15
p2位址=0000020D5E64F7A4,p2值=30
列印成員變量偏移值----------------
MYACLS::m_i偏移值 = 0
MYACLS::m_j偏移值 = 4
int MYACLS::* __ptr644
MYACLS::m_j偏移位址 = 4
MYACLS::m_i偏移位址 = 0
sizeof(mypoint) =4
mypoint2 = -1
成立
*/
return 1;
}