




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++〔变量〕本章主要介绍几个概念变量和常量:bool、char、int、short、long、float、double,留意个变量的所占的字节数。cons区分。#defineMAX 100 //宏常量constintMAX=100; // C++constchar*p=“helloworld“; //字符串常量全局变量和静态变量extern关键字再次声明这个全局变量。量。静态全局变量作用于其定义它的源文件里,不能作用到其它源文件,即被static数体始终可见。即假设全局变量加上static,static,则转变其内存存储位置,不转变其作用域。调用时,如何实现?最简洁想到的方法是定义一个全局的变量,但定义为一个〔使得在此函数中定义的变量,不仅仅受此函数把握〕。关于静态变量static的一个小小的测试:#include<iostream>usingnamespacestd;intTest(inta){staticintb=5;b+=a;returnb;}intmain{inta=Test(10);cout<<a<<endl;intb=Test(20);cout<<b<<endl;return0;}1、C++编译的程序占用的内存分类栈区〔stack〕:程序运行时由编译器自动安排,存放函数的参数值,局部〔heap〕OS,安排方式倒是类似于链表。静态区〔static〕:编译器编译时即安排内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量 初始化的静态变量在相邻的另一块区域。程序完毕后由系统释放。文字常量区:常量字符串就是放在这里的。程序完毕后由系统释放。程序代码区:存放函数体〔类成员函数和全局函数〕的二进制代码。2、内存安排方式有三种程序的整个运行期间都存在。例如全局变量,static在栈上创立:在执行函数时,函数内局部变量的存储单元都可以在栈上创立指令集中,效率很高,但是安排的内存容量有限。freedelete存的生存期由我们打算,使用格外灵敏,但问题也最多。变量内存分布通过程序加以说明〔1〕变量分布ViewCode运行结果:ViewCode分析结果〔debug〕:变量在内存地址的分布为:栈-堆-代码区-全局静态-文字常量区栈中是由高到低的。全局变量和静态变量假设不赋值,默认为0。栈中的变量假设不赋值,则是一个随机的数据。,未初始化的全局变量和静态变量安排在另一起。〔2〕函数分布ViewCode运行结果ViewCode结果分析:栈的伸展方向是由高地址向低地址扩展的量安排在另一起。程序变量分区中栈和堆的区分申请方式intb;系统自动bheap:Cmalloc,C++new运算符。p1=newchar[10];p2=newchar[20];p1、p2申请后系统的响应提示栈溢出。堆:首先应当知道操作系统有一个记录空闲内存地址的链表,当系统收到程序会在这块内存空间中的首地址处记录本次安排的大小,这样,代码中的delete语句才能正确的释放本内存空间。由于找到的堆结点的大小不愿定正好等于申请的大小,系统会自动的将多余的那局部重放入空闲链表中。申请大小的限制Windows这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS2M〔1M,总之是一个编译时就确定的常数〕,假设申请的空间超过栈的剩余空间时,将提示overflow较小。间比较灵敏,也比较大。申请效率的比较栈由系统自动安排,速度较快。但程序员是无法把握的。最便利。堆和栈中的存储内容下一条可执行语句C当本次函数调用完毕后,局部变量先出栈,然后是参数,最终栈顶指针指向最开头存的地址,也就是主函数中的下一条指令,程序由该点连续运行。chars1[]=“a“;char*s2=“b“;abint main{chara=1;charc[]=“1234567890“;char*p=“1234567890“;a=c[1];a=p[1];return0;}对应的汇编代码10:a=c[1];004010678A4DF1movcl,byteptr[ebp-0Fh]0040106A884DFCmovbyteptr[ebp-4],cl11:a=p[1];0040106D8B55ECmovedx,dwordptr[ebp-14h]004010708A4201moval,byteptr[edx+1]004010738845FCmovbyteptr[ebp-4],alcledxedx小结堆和栈的主要区分由以下几点:1、治理方式不同;2、空间大小不同;3、能否产生碎片不同;4、生长方向不同;5、安排方式不同;6、安排效率不同;memoryleak。324GVC61M从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,的可以参考数据构造。向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。编译器进展释放,无需我们手工实现。的效率比较高。堆则是C/C++函数库供给的,它的机制是很简洁的,例如为了安排一块内存,库函数会依据确定的算法〔具体的算法可以参考数据构造/操作系统〕〔可就有可能调用系统功能去增加程序数据段的内存空间,得多。EBP〔除非你是有意使其越界C++〔new/deletevsmalloc/free〕new/deletevsmalloc/freemallocfreeC++/C标准库函数,new/deleteC++的运算符。malloc/free不在编译器把握权限之内,不能够把执行构造函数和析构函数的任务强加于。因此C++语言需要一个能完成动态内存安排和初始化工作的运算符newdeletenew/delete不是库函数。new/deletemalloc/freeC++不把C++CCmalloc/freeC++内存治理之五〔数组vs〕以为两者是等价的。但二者有着本质的区分:〕一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以转变。针来操作动态内存。指针远比数组灵敏,但也更危急。下面以字符串为例比较指针与数组的特性:修改内容1a6hello。aa[0]=‘X’p“world”〔位于静态存储区,内容为world〕,常量字符串的内容是不行以被修改的。从语法上看,编译容而导致运行错误。1修改数组和指针内容chara[]=“hello”;a[0]=‘X’;cout<<a<<endl;char*p=“world”;//pp[0‘X’;//编译器不能觉察该错误cout<<p<<endl;内容复制与比较2中,假设想把数组a的内容复制给b,不能用语句b=a,否则将产生编译错误。应当用标准库函数strcpy进展复制。同理,比较baif(b==a)来推断,应当strcmpp,apamallocpstrcpyif(p==a)strcmp实例2数组和指针的内容复制与比较//chara[]=“hello“;charb[10];strcpy(b,a);//不能用b=a;if(strcmp(b,a)==0)//不能用if(b==a)„//intlen=strlen(a);char*p=(char*)malloc(sizeof(char)*(len+1));strcpy(p,a);//不要用p=a;if(strcmp(p,a)==0)//不要用if(p==a)„计算内存容量sizeof〔字节数〔asizeof(a)12〔留意别忘了’’〕。指针pa,但是sizeof(p4。这sizeof(char*),而申请内存时记住它。留意当数组作为函数的参数进展传递时,该数组自动退化7-3-3〔b〕中,不管数组asizeof(a)始sizeof(char*)。实例3(a)计算数组和指针的内存容量chara[]=“helloworld“;char*p=a;<<endl;//12cout<<sizeof(p)<<endl;//43(b)数组退化为指针voidFunc(chara[100]){cout<<sizeof(a)<<endl;//4100}指针参数是如何传递内存的?4(a)GetMemory(str,200)str,strNULL,为什么?实例4(a)试图用指针参数申请动态内存voidGetMemory(char*p,intnum){p=(char*)malloc(sizeof(char)*num);}voidTest(void){char*str=NULL;GetMemory(str,100//strNULLstrcpy(str,“hello“);//运行错误}指针参数p的副本是_p,编译器使_p=p。假设函数体内的程序修改了_p的p_ppGetMemoryGetMemory就free4(b)实例4(b)用指向指针的指针申请动态内存voidGetMemory2(char**p,intnum){*p=(char*)malloc(sizeof(char)*num);}voidTest2(void){char*str=NULL;//留意参数是&strstrstrcpy(str,“hello“);cout<<str<<endl;free(str);}4(c)实例4(c) 用函数返回值来传递动态内存char*GetMemory3(intnum){char*p=(char*)malloc(sizeof(char)*num); returnp;}voidTest3(void){char*str=NULL;str=GetMemory3(100);strcpy(str,“hello“);cout<<str<<endl;free(str);}用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return4(d)实例4(d)return语句返回指向“栈内存”的指针char*GetString(void){charp[]=“helloworld“; returnp;//编译器将提出警告}voidTest4(void){char*str=NULL;str=GetString;//str的内容是垃圾cout<<str<<endl;}用调试器逐步跟踪Test4strGetStringstrNULLworld”而是垃圾。4(d4(e),会怎么样?4(e)returnchar*GetString2(void)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 洗车店防水装修合同范本
- 管道拆迁补偿协议书范本
- 银行存钱协议书模板模板
- 私人钢结构厂房合同范本
- 篮球馆员工合同协议模板
- 父亲赠与女儿房产协议书
- 砍伐树木后要栽树协议书
- 船舶股份转让合同协议书
- 环卫特种车租赁合同范本
- 鹤壁买房定金协议书模板
- 第三章 科学研究与科学方法论
- 山东黄金归来庄矿业有限公司归来庄金矿矿山地质环境保护与土地复垦方案
- 项目融资计划书
- 针刺伤的预防及处理
- YY/T 0595-2020医疗器械质量管理体系YY/T 0287-2017 应用指南
- LS/T 1222-2020粮食干燥机系统工艺设计技术规范
- GB/T 26636-2011动植物油脂聚合甘油三酯的测定高效空间排阻色谱法(HPSEC)
- GB/T 19869.1-2005钢、镍及镍合金的焊接工艺评定试验
- GB/T 1796.4-2017轮胎气门嘴第4部分:压紧式无内胎气门嘴
- 中考语文非连续性文本阅读10篇专项练习及答案
- 上海高一数学教材电子版
评论
0/150
提交评论