1.C语言代码
#include <stdio.h>
int main()
{
int my_list[10] = { 12, 34, 56, 78 , 89 };
printf("内存地址为:%p \n", &my_list[0]); // 打印不同数据存储在内存中的地址
printf("内存地址为:%p \n", &my_list[1]);
printf("内存地址为:%p \n", &my_list[2]);
printf("内存地址为:%p \n", &my_list[3]);
printf("内存地址为:%p \n", &my_list[4]);
return 0;
}
- 数组中的首个元素的地址,即为数组的地址。用这个地址+整个数组占用的内存长度即为整个数组的完成地址信息
2.打开调试界面
准备工作:【工具】-------->【选项】-------->【调试】-------->【常规】-------->勾选【启用地址级调试】(默认开启)
【调试】-------->【逐语句】
如上步骤点完,发现整个界面多了窗口,方便调试使用
【调试】-------->【窗口】-------->【内存】-------->【内存1】(任意选择一个内存即可)
最终,界面又多了一个内存窗口。这里面是不同的内存地址,存储的具体数据(十六进制存储)
点击【逐语句】按钮
程序会按照一条一条语句,逐步往下运行,点一次运行一条语句
3.找到十六进制的内存地址,并分析:
- 逐步执行代码,直到程序把数组的地址打印出来。
- 根据如下截图,下半部分方框中,打印了数组my_list的地址.
- 可以右键复制或直接输入到【内存地址】中,注意只输入十六进制地址.然后回车,就能再【内存】对话框中,找到这个地址存储的数据了。
- 八个比特位存储一个数据信息,从左到右,我们数8位(两两一组,算两个比特位),这样0c 00 00 00,就是我们要的第一个十六进制数据信息
4. 内存中数据的存储方式?
如上步骤,我们得到了内存中存储的数据是0c 00 00 00,但好像还不是我们希望看到的样子,实际数据是12
- 内存中,数据的存储其实是倒着存的(这个又涉及大端和小端的问题),电脑上一般是小端,即数据的低位保存在内存的低地址中,数据的高位则保存在内存的高地址中。低地址–>>低数据 。
- 详情可参考:https://blog.csdn.net/duchenlong/article/details/101539348
- 那最终我们看到的数据再倒过来,即00 00 00 0c 这个才是它本来的面目,十六进制中,c代表12,即我们保存的数据为12
- 不同进制数据的对照表,参考:https://blog.csdn.net/chenmozhe22/article/details/89035462
5.内存中数据地址的高位、低位?
在继续往下执行几个语句,发现前面几个数据的存储地址依次为:
12-----0x012FFDA4
34-----0x012FFDA8
56-----0x012FFDAC
78-----0x012FFDB0
如上地址中,内存地址数值越来越大,我们叫高位地址
如上的地址,每个地址间隔是4个大小(因为两两分组,占8个比特位)信息都是按照(1字节=8比特位)存储的
十进制-----十六进制对照表
12-----00 00 00 0c
34-----00 00 00 22
56-----00 00 00 38
78-----00 00 00 4e