成员变量地址、偏移、指针等重申

// project100.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <time.h >
#include <stdio.h>
#include <vector>

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;
	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;
	//成员变量指针不论赋值为0或NULL都会变成Oxffffff(-1),0x000000为偏移值地址是有意思的
	mypoint2 = 0; //成员变量指针
	mypoint2 = NULL; //0xffffffff
	printf("mypoint2 = %d\n", mypoint2);

	//if(mypoint2 == mypoint) //不成立
	int MYACLS::*mypoint10 = &MYACLS::m_i;
	if (mypoint == mypoint10) //成立的
	{
		cout << "成立" << endl;
	}

	//mypoint2 += 1;
	//mypoint2++;
	//mypoint2 = ((&MYACLS::m_i) + 1);




	return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值