天天看點

4.11成員變量位址,偏移,指針等重申

#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;
}

           

繼續閱讀