变量的地址会改变吗?变量能被正常访问吗,该怎么解决

变量的地址会改变吗??变量能被正常访问吗
在看操作系统内存管理的时候,
突然想到一个问题,我们知道操作系统中有段页式管理,
假如我写一段程序代码,里面有一变量int   a,int   *p   =   &a,
这两个变量在同一段的同一页面中,
因为段页式管理会导致程序的各个页面在内存中是动态变化的,
假如系统有很多程序在运行,需要大量的页面切换,经过若干时间后,int   a,int   *p   =   &a所在的页面在内存中发生了变化,我仍然用*p去访问变量a会不会访问不到a,因为   在内存中的物理地址发生变化,我觉得p存储的指针已经不再指向a了,

呵呵   事实上我从来没碰到那样的情况,只是觉得有些不明白.

------解决方案--------------------
我们看到的地址是虚拟地址,本质上他是一个指针!和通常的指针不一样,不一样的地方就是解码方式不同。虚拟地址要经过多次转换才能变成物理地址(W32系统要经过两层变换,Linux要经过3层变换,不过在32位系统下简化为两层,其他系统不清楚,^_^具体请参考Linux代码分析)经过转换之后虚拟地址就指向物理地址了。虚拟地址相当于加密的指针,所以从虚拟地址看不出来指向物理地址哪里。至于转换过程,对我们来说是透明的,他是CPU和操作系统合作的结果。
程序的内存空间相当于一个巨大的指针数组。假设为ARRY[1M],总共有1M项,每项指向4K的内存页,所以共有4G内存空间。(实际上这个数组也是两层的,ARRY1[1024]指向ARRY2[1024],ARRY1的1024项每项指向一个ARRY2[1024],所以有1M项。采用两层的原因是节省内存。)这个数组由操作系统管理,我们看不到。
对于你给的例子int a; int *p = &a; 假设p赋值后等于0x88888,假设实际的物理地址为0x66666。经过一段时间的运行后,内存页换进换出,现在假设a存储于物理地址0x99999,操作系统只用改变那个巨大内存数组某项的值,当你用指针p(0x88888)访问内存时,访问到了物理地址0x99999。内存指针p的值没有改变,但是访问的是不同的物理内存!
这个比较复杂,不是三言两语可以说清楚的,建议LZ参考内存分页机制的实现,里面有虚拟地址与物理地址的转换。