全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
sizeof一维数组和二维数组1. sizeof的说明sizeof在C语言里面属于操作符,不属于函数,和变量的+,-属于同样的操作符。sizeof后面的括号里面,可以放类型名,数组名等内存大小确定的类型,不能计算函数名,可变数组的内存大小等2. sizeof计算一维数组首先,看如下代码:#includeint main()int a=1,2,3,4;/*打印内存地址*/printf(0x%x, 0x%x, 0x%x, 0x%xn,a,&a,a+0,&a0);/*计算内存大小*/printf(%d, %d, %d, %dn,sizeof(a),sizeof(&a),sizeof(a+0),sizeof(&a0);return 0;我们知道,a代表数组的起始地址,也就是数组a的0号位元素的内存起始地址,a+0代表指针a偏移0,因此指向的还是数组的起始地址,所以a=&a=a+0=&a0,虽然他们的数值相等,都表示数组起始地址,但他们的意义不同。数组名a代表数组起始地址,如果它参与指针偏移运算,那么它就代表一个指向某一位元素的指针(看本文章最后的总结,数组名参与偏移运算,退化为指针),例如a+0代表指向数组0号位元素的指针,因此它的内存大小为4。数组元素a0和*(a+0)表示的意义相同,访问a0,就是从数组首地址开始偏移0,然后再访问内存中的数值,所以,&a0就是&(*(a+0),&和*抵消,为a+0,代表指向数组0号位元素的指针,内存大小为4。经过上面的分析,就可以理解代码的运行结果,已经在windows XP,vc6.0下编译链接过:3. sizeof计算二维数组首先,看如下代码:#include#includeint main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int n=sizeof(a00); printf(a=0x%x,*a=0x%xn,a,*a); printf(a size=%d,*a size=%dn,sizeof(a),sizeof(*a); printf(-n); printf(a0=0x%x,*(a+0)=0x%xn,a0,*(a+0); printf(a0 size=%d,*(a+0)=%dn,sizeof(a0),sizeof(*(a+0); printf(-n); printf(&a0=0x%x,&a00=0x%xn,&a0,&a00); printf(&a0 size=%d,&a00 size=%dn,sizeof(&a0),sizeof(&a00); printf(-n); printf(a1=0x%x,a+1=0x%xn,a1,a+1); printf(a1 size=%d,a+1=%dn,sizeof(a1),sizeof(a+1); printf(-n); printf(&a10=0x%x,*(a+1)+0=0x%xn,&a10,*(a+1)+0); printf(&a10 size=%d,*(a+1)+0 size=%dn,sizeof(&a10),sizeof(*(a+1)+0); printf(-n); printf(a2=0x%x,*(a+2)=0x%xn,a2,*(a+2); printf(a2 size=%d,*(a+2) size=%dn,sizeof(a2),sizeof(*(a+2); printf(-n); printf(&a2=0x%x,a+2=0x%xn,&a2,a+2); printf(&a2 size=%d,a+2 size=%dn,sizeof(&a2),sizeof(a+2); printf(-n); printf(a10=0x%x,*(*(a+1)+0)=0x%xn,a10,*(*(a+1)+0); printf(a10 size=%d,*(*(a+1)+0) size=%dn,sizeof(a10),sizeof(*(*(a+1)+0); printf(-n); return 0; 以上代码,包含了用sizeof计算各种各样二维数组相关的内存大小,大家不要感到疑惑,读完下面的分析,我们就明白了。a代表了二维数组的起始地址,&a在内存上和a表示的是同一个地方,还是二维数组的起始地址,因此用sizeof计算它们的值,就是整个二维数组所占用的内存空间。那么,*a,a0,a+0,&a0,&a00,*(a+0),这些都代表什么呢?我们可以用下面这个图来描述二维数组a:printf(a size=%d,*a size=%dn,sizeof(a),sizeof(*a);这句代码中,sizeof(a)表示整个二维数组的大小,*a表示*(a+0),所以,*a表示一维数组1,3,5,7的首地址,因此sizeof(*a)是4*sizeof(int)为16。printf(a0 size=%d,*(a+0)=%dn,sizeof(a0),sizeof(*(a+0);a0也就是*(a+0),和*a一样,也是指向一维数组1,3,5,7的首地址,因此a0,*(a+0)用sizeof计算内存大小,就是4*sizeof(int)为16printf(&a0 size=%d,&a00 size=%dn,sizeof(&a0),sizeof(&a00);&a0就是&(*(a+0),&和*互相抵消,因此相当于a+0,数组名参与了指针偏移运算,因此sizeof(&a0)的大小为指针的内存大小,是4字节。&a00就是&(*(*(a+0)+0),&和*抵消以后,为*(a+0)+0,*(a+0)代表一维数组1,3,5,7的首地址,因此*(a+0)+0表示数组首地址参与偏移操作,成为指向数组1,3,5,70号位元素1的指针,sizeof(&a00)的大小为4剩下的printf的打印相信大家就能理解了,运行结果如下:我们总结为一句话,不论是一维数组,还是二维数组,如果直接sizeof数组名,那么大小为整个数组所占用的内存空间,如果计算类似a+0,a+1等数组名进行了偏移运算,那么它就代表指向某个元素的指针,sizeof计算的话,其大小为指针的内存大小,如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国农业科学院烟草研究所高层次人才招聘5人笔试题库附参考答案详解【完整版】
- 2026广西凭祥产业园区工会联合会社会化工会工作者招聘2人考前冲刺密卷含答案详解(培优A卷)
- 2026中国农业科学院农业资源与农业区划研究所资划所高层次人才招聘笔试题库重点附答案详解
- 2026年海南省生态环境监测中心公开招聘事业编制人员(第1号)考前冲刺试卷附参考答案详解(突破训练)
- 外墙变形缝施工方案
- 2026年度网络安全工作情况报告
- 2026年传染病知识培训试题幼儿园及答案
- 酒店安全知识培训
- 2026年自贡市大安区社会工作服务领域增量政策性岗位招募的(9人)模拟试卷含完整答案详解【必刷】
- 房建工程施工材料管理及质量措施
- 重庆万州区2026年社区工作者招聘考试试卷-含答案解析
- 湖北省宜昌市秭归县县域高中联合体2025-2026学年高一下学期期末测评语文试题(含答案)
- 餐饮业餐厅经理经营效益及团队管理KPI考核表
- 2026年作风建设年研讨发言材料-强化责任担当、认真履职尽责,抓好作风建设
- 丹东施工方案
- 沪教版初中英语八年级上册Unit 2 Amazing Numbers语法教案
- 2026年江苏省省属事业单位统一公开招聘《综合知识和能力素质》真题
- 2026浙江省空港融资租赁有限公司招聘1人笔试备考题库及答案详解
- 宿舍管理员安全工作全流程培训
- 《3~6岁儿童学习与发展指南》考试题库及答案2026年
- 高中英语3500词汇完整
评论
0/150
提交评论