




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于内存模型自己的几点理解:我们可以把计算机的内存看成是一个带有很多格子的一个很长的容器(如下)他们是连续编号的,当然至于是从大到小还是从小到大依据机器而定(所谓的大端和小端)第一个问题:#includeint main(void)int a=0;int b=0;int c=0;printf(%d,%d,%d n,&a,&b,&c);return 0;思考一下 输出的结果是什么?代表什么意思?运行的结果是:1245052 1245048 1245044这些数据代表的是什么呢?是首地址!也就是a在内存模型中的首地址是1245052 b的是1245048 c的是1245044我们假设现在的内存模型是这个样子的1245055124505412450531245052124505112450501245049124504812450471245046为了方便表示,将内存编号简写一下:555453525150494847464544434241403938红色表示a在内存中存放位置黑色表示b在内存中存放的位置蓝色表示c在内存中存放的位置解释几个问题:1, 内存的最小单位是字节,一个字节占8位,这就是为什么char的最大值是255.这句话的深层含义是我们的方格还可以再分,他可以分成8份。2, 为什么先定义的内空间的内存编号比后定义的大?这是因为这些变量时定义在栈段的,栈指针从大到小。(这是我自己根据汇编的理解,望高手斧正,感激不尽!)3, 为什么a在内存中占4个字节?我们知道int占2个字节,但不同的编译器可能会不同,书本上都有介绍的。我用的vc6.0,int 占4个字节4, 你怎么知道内存的高位在编号大的地方?这个问题不必深究,这和机器有关,就是所谓的大端小端第二个问题:#includeint main(void)int a=0;int b=0;int c=0;printf(%d,%d,%d n,&a,&b,&c);int k=0;k=(int)&a;printf(k=%d n,k);printf(*k=%d n,*(int *)k);return 0;运行的结果如下:解释几个问题:1, k=(int)&a;为什么要强制转换?这是因为&a的类型和k的类型不匹配,虽然&k输出的是一个数字,但是他的类型是未定义的,所以我们需要强制转换2, 我们发现输出的是k=1245052,也就是a在内存中存放的首地址。我认为内存的编号和内存是一一对应的也就是一个内存空间,只能有一个编号。因此我猜想能不能通过内存编号来找到内存中的值呢?3, *k=0,说明我们成功的提取出了内存中的a的值,(也许你认为k=0不一定是a的值,你可以实验任何一个值,发现我的结果是对的)。注意这里的结论:内存编号和内存是一一对应的,我们可以通过内存的编号去访问该内存中的值,而不需要通过变量名为了说明上面的结论,给一个更加直接的例子:#includeint main(void)int a=8;int b=0;int c=0;printf(%d,%d,%d n,&a,&b,&c);int k=0;k=(int)&a;printf(k=%d n,k);printf(*k=%d n,*(int *)k);printf(a=%d n,*(int *)1245052);return 0;运行的结果是:第三个问题:现在这里给出一个结论:C语言提取内存数据的机制可能是:首先找到变量在内存中的首地址,然后找到他在内存中所占空间的大小,也就是字节数。最后得出该变量的值。具体来说:首先找到a在内存中的首地址(1245052),然后因为a的类型是int所以编译器会从首地址出发找到四个字节的空间,提取出这四个字节中的值(8)作为a的值。#includeint main(void)int a=99;int b=0;printf(%d,%d n,&a,&b);int k=0;k=(int)&a;printf(k=%d n,k);printf(*k=%d n,*(int *)k);printf(*k=%c n,*(char *)k);return 0;运行的结果是:解释几个问题:1,*(int *)k 是什么意思? k代表的内存的首地址,为什幺强制转换?根据我们上面的理论,我们要在内存中提出一个值,需要两个条件,一个是首地址,一个是长度。K提供了首地址,那么自然int 就提供了长度。也即是,这句话告诉编译器,我们要从k为首地址的地方,提取4个字节的变量值(int),所以*k的值是992,*(char *)k的意思同上,只是这次的长度为1了。所以输出为:(ASSIC码 97)c看一下内存模型:555453525150494847464544434241403938_这四个字节表示a *(int *)1245052_这一个字节表示*(char *)1245052 (下划线表示内存中的字节数)第四个问题:内存编号为1245053这个字节中内容为多少呢?#includeint main(void)int a=99;int b=0;printf(%d,%d n,&a,&b);int k=0;k=(int)&a;printf(k=%d n,k);printf(*k=%d n,*(int *)k);printf(*k=%c n,*(char *)k);printf(*k=%d n,*(char *)(k+1);return 0;输出结果为:解释几个问题:1, printf(*k=%d n,*(char *)(k+1);这表示我们要提取内存首地址编号为k+1,长度为1内存中的值2, 最后输出的结果为0,说明该内存单元的值此时为0我们看一下内存模型:555453525150494847464544434241403938a的值为99,从高到低存放。a占4个字节,那么此时的内存情况是这样的55545352 (字节)00000000000000000000000001100011很明显99只用一个字节就可以存储,那么第二个字节自然就是0了,这就是为什么*(char *)(k+1)的结果为0也许你还不是很确定结论的正确性,看下面的例子:#includeint main(void)int a=257;int b=0;printf(%d,%d n,&a,&b);int k=0;k=(int)&a;printf(k=%d n,k);printf(*k=%d n,*(int *)k);printf(k0=%d n,*(char *)k);printf(k1=%d n,*(char *)(k+1);printf(k2=%d n,*(char *)(k+2);printf(k3=%d n,*(char *)(k+3);return 0;运行的结果:依照上面的理论来分析运行的结果:当a为257时的内存模型状态:55545352 (字节)00000000000000000000000100000001通过上面的内存模型,结果一看即明白!第5个问题:关于数组的内存模型:#includeint main(void)char a4=0;a0=1;a1=1;a2=1;a3=1;printf( a0:%d n a1:%d n a2:%d n a3:%d n ,&a0,&a1,&a2,&a3);return 0;运行的结果:解释几个问题:1, 我们在这里定义了一个char型数组,其实就相当于连续定义了四个变量发现内存结果和上面的变量很相似,只是定义变量的循序问题我们看一下这时的内存状态: a3 a2 a1 a05 5545352 (字节)00000001000000010000000100000001思考这样的一个问题,下面的程序会输出到少?#includeint main(void)char a4=0;a0=1;a1=1;a2=1;a3=1;printf( a0:%d n a1:%d n a2:%d n a3:%d n ,&a0,&a1,&a2,&a3);printf(%dn,*(int *)&a0);return 0;运行的结果为:解释一个问题:1,16843009的二进制的形式为1000000010000000100000001,是不是很吃惊?第六个问题:关于指针的内存模型:#includeint main(void)int a=0;int b=0;int * pa=NULL;int * pb=NULL;printf(&a=%dn&b=%dn,&a,&b);pa=&a;pb=&b;printf(pa=%dnpb=%dn,pa,pb);return 0;运行结果是:解释一些问题:1, 我们在这里定义了多少个变量?准确答案是4个,其中有两个int变量,有两个指向int的指针变量2, 为什么没有强制转换,因为pa的类型和&a的类型一致3, 在这里提出一个观点:指针就是装内存编号的变量。总结一下:1, 内存模型我们可以把计算机的内存看成是一个带有很多格子的一个很长的容器(就像下面一样)他们有编号的,并且编号是连续的。2, 每一个内存单元都有唯一的与之对应的内存编号3, 我们可以通过内存编号来访问该内存单元中的内容4, C语言提取内存数据的机制可能是:首先找到变量在内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆昌吉州教育共同体2025年高一下化学期末质量检测模拟试题含解析
- 2025年中国网眼两路网络视频服务器行业投资前景及策略咨询研究报告
- 2025年中国电子称斗行业投资前景及策略咨询研究报告
- 2025年中国滤袋式过滤器行业投资前景及策略咨询研究报告
- 2025年中国水表计数器行业投资前景及策略咨询研究报告
- 2025年中国智能票据打印机行业投资前景及策略咨询研究报告
- 2025年中国常温除尘布行业投资前景及策略咨询研究报告
- 2025年中国大型纯水矿化设备行业投资前景及策略咨询研究报告
- 2025年中国台面式空气清香剂行业投资前景及策略咨询研究报告
- 2025年中国半螺节能灯行业投资前景及策略咨询研究报告
- 兵团开放大学2025年春季《公共关系学》终结考试答案
- 电线电缆出入库管理制度
- T/CADCC 003-2024汽车漆面保护膜施工技术规程
- 2025年金融科技企业估值方法与投资策略在金融科技企业并购中的应用案例报告
- 福建省厦门市双十中学2025届七年级生物第二学期期末联考模拟试题含解析
- 【小学】新苏教版小学数学四年级下册暑假每日一练(02):计算题-应用题(含答案)
- 2025猪蓝耳病防控及净化指南(第三版)
- TCUWA20059-2022城镇供水管网模型构建与应用技术规程
- 2025至2030中国压缩空气储能产业现状调查及项目投资策略建议报告
- 三台县2024-2025学年小学六年级数学毕业检测指导卷含解析
- 宅基地互换合同协议书范本
评论
0/150
提交评论