C++成员指针

1.成员指针是一种相对地址
2.结构体中或者类中的成员(变量或者函数)的相对地址的获取方式  &结构类型名::成员
3.声明成员指针变量

          成员类型  结构类型名::*指针变量名

4.通过成员指针访问结构成员

          结构变量*指针变量名


//我们要声明 指针 指向成员变量,成员变量的地址会一样么?成员变量的地址是由结构体对象决定的

#include <iostream>
using namespace std;

//日期结构体
struct Date{
    int year; //年月日三个成员变量
    int month;
    int day;
    void show (){
        cout << year << '-' << month << '-' << day << endl;
    }
};



//创建这个结构体是想测试结构体对象的内存空间
struct Student {
    int age;  //年龄
    char sex; //性别
    double score; //分数
    void study(){
        cout << "学生的分数是:" << score << endl;
    }
};




int main(){
    
    //获取成员变量地址  &类型名::变量名
    //&Date::year;
    //int* py = &Date::year;
    
    //声明 成员变量指针  指向成员变量
    int Date::* py = &Date::year;
    int Date::* pm = &Date::month;
    int Date::* pd = &Date::day;
    
    //通过指针 输出它们的地址
    cout << py << endl;
    cout << pm << endl;
    cout << pd << endl;
    /*
     会发现打印的结果都是1,原因是cout打印不出成员变量的地址,打印1是相当于true告诉你这真的是地址
     */
    printf("py = %p\n",py);
    printf("pm = %p\n",pm);
    printf("pd = %p\n",pd);
    
    /*
     py = 0x0
     pm = 0x4
     pd = 0x8
     输出的结果是0 4 8  那是因为这是相对地址  相对于这个对象的开始地址来说,第一个year相对于对象是0 ,然后month是int类型占4个字节,所以month相对于对象的地址是4...day是8
     
     每个对象都有这三个变量,每个变量相对于每个对象的地址都是0  4  8
     */
    
    
#pragma  通过一个结构体(类)创建的对象在内存当中到底占多大空间??? 创建对象的时候 分配内存空间的大小是由该类的成员变量决定(方法创建完都放在代码区的,所以在此不考虑内存空间,方法名是一个函数指针,通过函数指针找到那个函数去调用)
    
    Date d;
    cout << "日期对象占的内存空间多大: " << sizeof(d) << endl;//输出12
    
    
    Student stu;
    cout << "学生对象占的内存空间大小: " << sizeof(stu) << endl;//输出16
    /*
     
     这里输出的却是16   为什么呢?为什么不是结构体变量类型占的内存空间的累加呢?这里就错了!
     
     C语言求结构体大小的问题,成员变量的类型不一样这里涉及到(“对齐补齐”)的原理
     
     */
    
    
    
#pragma 获取到成员变量的地址有什么用?
    Date date;
    date.year = 2015;
    cout << "通过成员变量本身访问 " << date.year << endl;
    
    //能不能通过 成员变量指针 去赋值?
    date.*py = 2999; //*py指向一个成员变量year  所以也就相当于date.year  注意 .*不能分开,它们是一个运算符
    cout << "通过成员变量指针赋值 " << date.year << endl;
    
    date.month = 13;
    date.day = 32;
    date.show();     //输出 2999-13-32
    
    
    //这时候date在栈里,date是一个对象,对象访问成员变量用点.  访问成员变量指针用点星 .*
    
    
#pragma 如果对象在堆里呢???
    Date *pdate = new Date;  //堆中是用一个指针来指向一个堆里的空间
    //通过指针访问变量 是用箭头 ->
    pdate ->year = 3000;
    cout << "通过指针访问变量" << pdate->year << endl;
    
    //能通过 成员变量指针 访问成员变量吗?
    pdate->*py = 3333;
    cout << "通过 成员变量指针 访问成员变量 " << pdate->year << endl;
    
    // 同理箭头星也是一个运算符   成员变量指针*py指向year可以取出year, 整体相当于pdate ->year
    
    
    
    return 0;
}





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值