上一节课给大家介绍了普通变量的保存,本节课给大家介绍一下指针变量的保存。
如果一个变量是指针变量,那么我们按照普通变量的方式来保存是无效的,接下来我们先举个例子来简单说明这一现象。
我们对上节课的C程序稍作修改,把number变成一个指针变量
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *number=(int*)malloc(sizeof(int));
*number=100;
while(1)
{
system("cls");
int select=0;
printf("当前数字为:%d\n",*number);
printf("1.数字加10\n");
printf("2.数字不变\n");
printf("0.退出程序\n");
printf("输入您的选项:");
scanf("%d",&select);
if(select==0)
{
break;
}
switch(select)
{
case 1:
*number+=10;
break;
case 2:
break;
default:
break;
}
}
}
可以看到,number此时是一个一级指针变量,判断一个指针变量是几级的,就看它有几个星号【*】。
如果我们按照上节课来操作,就会得到这种结果
就是说,我们查找到的地址已经不再是number指针指向的地址了。
这现象解释起来也十分简单 ,我们可以看到这段代码【int *number=(int*)malloc(sizeof(int));】
它的意思就是程序运行的时候给number指针随机分配一段可用的地址空间,所以每次运行程序的时候,分配的地址空间都不尽相同,也就成功解释了我们保存的地址为啥不是上一次保存的数据了,那我们如果应对指针变量这种情况呢?
说起来也不难,指针它指向的地址是变化的,但是指针本身是不变的,有点抽象吧。
对于我们的内存单元,我们可以这样形象化,每一个内存单元由一个地址和一个数值这两个属性来描述。对于我们此课的C程序,number它是一个指针,它有自己的地址,它的数值存放的是我们要保存的数据的地址,用图来解释就是
每次启动number指针的数值都会发生变化,所以我们直接保存要保存的数据的地址是不正确的,会导致程序重新运行的时候找不到要找的数据
所以我们正确的保存姿势,应该是保存number指针的地址以及偏移量
但是无论如何,我们先利用第一节课的知识找到要保存的数据的地址
右键单击选中的记录,选择对此地址指针进行扫描
直接确定
第一次扫描将名称命名为1.ptr即可,以后依次类推。
这是第一次扫描出来的结果。可以看到有着上千个,暂时还不好断定哪个是我们要找的number指针。
我们可以把C程序进程关闭掉,重新打开,并使用CE修改器打开该进程,再回到1.ptr窗口,右键单击一条数据并选择更新视图。
可以看到有一些地址以及不再指向我们要找到数据了, 由于是一级指针,我们点击基址列排序
可以看到一级指针有且仅有一个,鼠标左键双击它,即可将其加入我们的记录栏目中。
接下来就可以把CE修改器多余的窗口关闭掉了,只留下主窗口即可。
图中所示为我们找到的number指针地址以及其偏移量,可以轻松修改数据。
我们使用上节课的方式保存,再重新打开C进程,CE扫描它并加载保存的文件,发现该变量还是可以修改我们感兴趣的数据,那么对于指针变量的保存和加载,我们就学会了。
多级指针如何查找呢?怎么确定它是几级指针呢? 下面把问题留给大家了,希望可以认真思考并积极回答,评论区就留给你们了。