【CPP】通过指针编译访问类成员

前置知识:内存对齐

首先定义一个简单的结构体

struct mCls
{
	int a;
	int b;
	double c;
};

当我们使用指针获取到了该类型的一个实例

mCls* mClsP = new mCls;

我们该如何通过该指针访问mCls类的数据成员呢?
根据我们既有知识可知,int4字节,double8字节,通过简单的猜想和测试可发现

mClsP->a = 666;
mClsP->b = 123;
mClsP->c = 108.321;

cout << *((int*)(mClsP)+0) << endl;
cout << *((int*)(mClsP)+1) << endl;
cout << *((int*)(mClsP)+2) << endl;
cout << *((double*)(mClsP)+1) << endl;

image


1.指针绑定的实例的地址即是类首位数据成员的地址
2.通过指针的类型转换,我们的合理猜想与尝试得到了符合预期的反馈(即如何通过偏移量和指针访问类成员)



那么如果类本身再变得复杂一些呢?

struct mClsC
{
	char a;
	char notAC;
	int b;
	double c;
};

int main()
{
	mClsC* mClsP = new mClsC;
	mClsP->a = 12;
	mClsP->notAC = 49;
	mClsP->b = 5678;
	mClsP->c = 108.321;


	cout << (int)*((char*)(mClsP)+0) << endl;
	cout << (int)*((char*)(mClsP)+1) << endl;
	cout << *((int*)(mClsP)+1) << endl;
	cout << *((double*)(mClsP)+1) << endl;

	return 0;
}

运行结果是
image
恰好与内存对齐的知识相照应了。


当然,还有更多更复杂的情形或者细节我没有考虑到,或许日后会进一步完善。






参考内容:C++编程——利用指针偏移访问类的私有成员

posted @ 2023-06-08 03:59  简直可啪  阅读(15)  评论(0编辑  收藏  举报