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