




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c-c+中static详解程序的存储从历史上讲,C程序一直由下面几部分组成:正文段CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是经常环境指针环境表环境字符串执行的程序(如文本编辑程序、C编译程序、s h e l l等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。初始化数据段通常将此段称为数据段,它包含了程序中需赋初值的变量。初始化 的全局变量和 静态变量存放在这里 。例如,C程序中任何函数之外的说明:int maxcount = 99; 使此变量以初值存放在初始化数据段中。a.初始化的全局变量b.初始化的静态变量非初始化数据段通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,未初始化 的全局变量 和静态变量存放在这里。在程序开始执行之前,内核将此段初始化为0。函数外的说明:long sum1000 ; 使此变量存放在非初始化数据段中。a.未初始化的全局变量b.未初始化的静态变量堆需要由程序员分配释放管理 ,若程序员不释放,程序结束时可能由OS回收。通常在堆中进行动态存储分配。如程序中的malloc, calloc, realloc等函数都从这里面分配。堆是从下向上分配的。栈由编译器自动分配释放管 理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C函数可以递归调用。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。a.局部变量b.函数调用时返回地址c.调用者的环境信息(例如某些机器寄存器)1. C 语言中的static。static 局部变量静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量 在函数内定义它的生存期为 整个程序生命周期,但是其 作用域仍与 自动变量相同 ,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。(2)对基本类型的静态局部变量若在声明时未赋以初值,则系统自动赋予0值 。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点,可以看出它是一种生存期为整个程序生命周期。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量 。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。例如:1. void test_static()2. 3. static int Temp = 1;4. Temp+;5. printf(Temp is :%d/n,Temp);6. 7. int main(int argc,char *argv)8. 9. int i=0; 10. for(i=0;i=4;i+)11. 12. test_static();13. 14. system(pause);15. 1. void test_static()2. 3. static int Temp = 1;4. Temp+;5. printf(Temp is :%d/n,Temp);6. 7. int main(int argc,char *argv)8. int i=0;9. for(i=0;i=4;i+)10. 11. test_static();12. 13. system(pause);14. 事实上,static int Temp = 1;这句只会在第一次调用的时候才会执行。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期 。static 全局变量 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于:(1). 非静态全局变量 的作用域是整个源程序 ,当一个源程序由多个源文件 组成时,非静态的全局变量在各个源文件中都是有效的。 (2). 而静态全局变量 则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于 一个源文件内 ,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出,把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围 。 static 函数如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为static函数与称为静态函数。 定义一个static函数,只需在函数类型前再加一个“static”关键字即可,如下所示: static 函数类型 函数名(函数参数表) 关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指 对函数的作用域仅局限于本文件 。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系 。2. C+ 中的static关键字(类中的static关键字)static 数据成员在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。1. #include 2. class Myclass 3. 4. public: 5. Myclass(int a,int b,int c); 6. void GetSum(); 7. private: 8. int a,b,c; 9. static int Sum; /声明静态数据成员 10. ; 11. int Myclass:Sum=0; /定义并初始化静态数据成员 12. /static int Myclass:Sum = 0; /注意加static, 是错误的 13. Myclass:Myclass(int a,int b,int c) 14. 15. this-a=a; 16. this-b=b; 17. this-c=c; 18. Sum+=a+b+c; 19. 20. void Myclass:GetSum() 21. 22. coutSum=Sumendl; 23. 24. void main() 25. 26. Myclass M(1,2,3); 27. M.GetSum(); / cout 6 28. Myclass N(4,5,6); 29. N.GetSum(); / cout 21 30. M.GetSum(); / cout 21 31. 1. #include class Myclasspublic: Myclass(int a,int b,int c); void GetSum();private: int a,b,c; static int Sum; /声明静态数据成员;int Myclass:Sum=0; /定义并初始化静态数据成员/static int Myclass:Sum = 0; /注意加static, 是错误的Myclass:Myclass(int a,int b,int c) this-a=a; this-b=b; this-c=c; Sum+=a+b+c;void Myclass:GetSum() coutSum=Sumfn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针 。从这个意义上讲,它无法访问属于类对象的no-static数据成员,也无法访问no-static成员函数,它只能调用其余的静态成员函数 。下面举个静态成员函数的例子。1. #include 2. class Myclass 3. 4. public: 5. Myclass(int a,int b,int c); 6. static void GetSum(); /声明静态成员函数 7. private: 8. int a,b,c; 9. static int Sum; /声明静态数据成员 10. ; 11. int Myclass:Sum = 0;/定义并初始化静态数据成员 12. Myclass:Myclass(int a,int b,int c) 13. 14. this-a=a; 15. this-b=b; 16. this-c=c; 17. Sum+=a+b+c; /非静态成员函数可以访问静态数据成员 18. 19. /static void Myclass:GetSum(). /加上static是错误的 20. void Myclass:GetSum() /静态成员函数的实现 21. 22. /coutaendl; /错误代码,a是非静态数据成员 23. coutSum=Sumendl; /静态函数是能访问静态数据成员 24. 25. void main() 26. 27. Myclass M(1,2,3); 28. M.GetSum(); 29. Myclass N(4,5,6); 30. N.GetSum(); 31. Myclass:GetSum(); 32. 1. #include class Myclasspublic: Myclass(int a,int b,int c); static void GetSum(); /声明静态成员函数private: int a,b,c; static int Sum; /声明静态数据成员;int Myclass:Sum = 0;/定义并初始化静态数据成员Myclass:Myclass(int a,int b,int c) this-a=a; this-b=b; this-c=c; Sum+=a+b+c; /非静态成员函数可以访问静态数据成员/static void My
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铁路改造工程环境影响报告书
- 2025年中国初级阅读真题及答案
- 新能源电池隔板加工制造项目建筑工程方案
- 高端医药中间体生产线建设项目技术方案
- 河北数学单招真题及答案
- 技术服务合同写作样式
- 光明区2024-2025学年第二学期三年级英语期末学业展示试卷及答案
- 商业办公空间租赁制式合同(含装修权属约定)
- 离婚后子女抚养责任及财产分割补充协议
- 棕榈油种植基地租赁合同范本:油脂加工与品牌合作
- MOOC 模拟电子电路实验-东南大学 中国大学慕课答案
- 多格列艾汀使用指南2024课件
- MOOC 创业基础-暨南大学 中国大学慕课答案
- GB/T 41666.4-2024地下无压排水管网非开挖修复用塑料管道系统第4部分:原位固化内衬法
- 云端药历健保署电子病历-慈济大学医学资讯学系
- 道路车辆 局域互联网络(LIN) 第3部分:协议规范
- 客户反馈管理方案处理客户反馈的有效举措
- 桩基工程施工总体部署
- 电梯故障分析报告
- 《春》专题探究课件(朗读的重音和停连)
- 电能质量技术监督培训课件
评论
0/150
提交评论