C语言中局部变量和全局变量_等在内存中的存放位置.doc

C 语言中局部变量和全局变量 变量的存储类别static,extern,auto,register 8.8 局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。8.8.1 局部变量局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。例如int f1int a /*函数 f1*/int b,c; a,b,c 有效int f2int x /*函数 f2*/int y,z; x,y,z 有效mainint m,n; m,n 有效在函数 f1 内定义了三个变量,a 为形参,b,c 为一般变量。在 f1 的范围内 a,b,c 有效,或者说 a,b,c 变量的作用域限于 f1 内。同理,x,y,z 的作用域限于 f2 内。m,n 的作用域限于 main 函数内。关于局部变量的作用域还要说明以下几点1 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。2 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。3 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为 n,是完全允许的。4 在复合语句中也可定义变量,其作用域只在复合语句范围内。例如mainint s,a;int b;sab; /*b 作用域*/ /*s,a 作用域*/【例 8.12】mainint i2,j3,k;kij;int k8;printf“dn“,k;printf“dn“,k;本程序在 main 中定义了 i,j,k 三个变量,其中 k 未赋初值。而在复合语句内又定义了一个变量 k,并赋初值为 8。应该注意这两个 k 不是同一个变量。在复合语句外由 main 定义的 k 起作用,而在复合语句内则由在复合语句内定义的 k 起作用。因此程序第 4 行的 k为 main 所定义,其值应为 5。第 7 行输出 k 值,该行在复合语句内,由复合语句内定义的k 起作用,其初值为 8,故输出值为 8,第 9 行输出 i,k 值。i 是在整个程序中有效的,第7 行对 i 赋值为 3,故以输出也为 3。而第 9 行已在复合语句之外,输出的 k 应为 main 所定义的 k,此 k 值由第 4 行已获得为 5,故输出也为 5。8.8.2 全局变量全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为 extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。例如int a,b; /*外部变量*/void f1 /*函数 f1*/float x,y; /*外部变量*/int fz /*函数 fz*/main /*主函数*/从上例可以看出 a、b 、x、y 都是在函数外部定义的外部变量,都是全局变量。但 x,y 定义在函数 f1 之后,而在 f1 内又无对 x,y 的说明,所以它们在 f1 内无效。a,b 定义在源程序最前面,因此在 f1,f2 及 main 内不加说明也可使用。【例 8.13】输入正方体的长宽高 l,w,h。求体积及三个面 x*y,x*z,y*z 的面积。int s1,s2,s3;int vs int a,int b,int cint v;va*b*c;s1a*b;s2b*c;s3a*c;return v;mainint v,l,w,h;printf“n length,width and heightn“;scanf“ddd“,vvsl,w,h;printf“nvd,s1d,s2d,s3dn“,v,s1,s2,s3;【例 8.14】外部变量与局部变量同名。int a3,b5; /*a,b 为外部变量*/maxint a,int b /*a,b 为外部变量*/int c;cabab;returnc;mainint a8;printf“dn“,maxa,b;如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“ 屏蔽” ,即它不起作用。8.9 变量的存储类别8.9.1 动态存储方式与静态动态存储方式前面已经介绍了,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。静态存储方式是指在程序运行期间分配固定的存储空间的方式。动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。用户存储空间可以分为三个部分1 程序区;2 静态存储区;3 动态存储区;全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;动态存储区存放以下数据1 函数形式参数;2 自动变量(未加 static 声明的局部变量);3 函数调用实的现场保护和返回地址;对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。在 c 语言中,每个变量和函数有两个属性数据类型和数据的存储类别。8.9.2 auto 变量函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明。例如int fint a /*定义 f 函数,a 为参数*/auto int b,c3; /*定义 b,c 自动变量*/a 是形参,b,c 是自动变量,对 c 赋初值 3。执行完 f 函数后,自动释放a,b,c 所占的存储单元。关键字 auto 可以省略,auto 不写则隐含定为“自动存储类别”,属于动态存储方式。8.9.3 用 static 声明局部变量有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字 static 进行声明。【例 8.15】考察静态局部变量的值。fint aauto b0;static c3;bb1;cc1;returnabc;mainint a2,i;fori0;iyxy;returnz;mainextern A,B;printf“dn“,maxA,B;int A13,B-8;说明在本程序文件的最后 1 行定义了外部变量 A,B,但由于外部变量定义的位置在函数 main 之后,因此本来在 main 函数中不能引用外部变量 A,B。现在我们在 main 函数中用 extern 对 A 和 B 进行“外部变量声明”,就可以从“声明”处起,合法地使用该外部变量 A 和 B。对于 malloc 而来的变量存储在堆(heap)中,局部变量都存储在栈(stack)中。堆和栈的区别堆和栈的区别 一个由 c/C编译的程序占用的内存分为以下几个部分 1、栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区( heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区存放函数体的二进制代码。在全局变量和全局静态变量有什么区别在全局变量和全局静态变量有什么区别变量可以分为全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 全局变量和静态变量如果没有手工初始化,则由编译器初始化为 0。局部变量的值不可知。 静态全局变量,只本文件可以用。 全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束.省略了存储类型符,系统将默认为是自动型. 静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存. 自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的.声明变量与定义变量有什么区别声明是向编译器介绍名字标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义是说“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。 在 C 和 C中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(有时这称为ODR,单一定义规则)。 定义也可以是声明,如果有 int x;,之前编译器未发现标识符 x,编译器则把这一标识符看成是定义并立即为它分配存储空间。 。 对“变量声明”的解释向来模糊且自相矛盾。 函数声明包括函数类型、函数名、参数列表和一个分号,这些信息足以编译器认出它是一个函数声明并可识别出这个函数的外部特征。由此推断,变量声明应是类型标识后面跟一个标识符。如 int a;但这产生了一个矛盾,这段代码有足够的信息让编译器为之分配存储空间,而且编译器也确实给之分配了存储空间。要解决这个问题,对于 C 和 C需要一个关键字来说明“这是一个声明,它的定义在别的地方”,这个关键字就是 extern,它表示变量是在文件以外定义的,或在文件后面定义的。 在变量定义前加 extern 表示声明一个变量但不定义它,如 extern int a; extern 也可用于函数声明,如 extern int func1int length,int width; 但由于没有函数体,编译器必把它当成声明而非定义,extern 对于函数来说是多余的、可选的。C 语言的设计者并不要求函数声明使用 extern,这可能有些令人遗憾,如果函数声明也要求用 extern,那么形式上与变量声明更加一致了,从而减少了混乱(但这就需要更多的输入,这也许能解释为什么不要求函数声明使用 extern 的原因)。 什么是字节对齐,为什么要对齐 现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU 在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个 int 型(假设为 32 位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这 32bit,而如果存放在奇地址开始的地方,就需要 2 个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该 32bit 数 据。显然在读取效率上下降很多。 在 C 语言里面,局部变量,全局变量都是存贮在栈( stack)里面的,而所有用 malloc 和 new 这种操作符动态分配的空间则都是存贮在堆(dump)里面的,举个简单的例子int *ptr;ptr int*malloc100*sizeofint;这两句中,ptr 这个指针变量是存贮在栈里面,但是他所指向的内容则是在堆里面。

A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...相关推荐

  1. C语言输入函数换行符赋给变量B,C语言程序设计第3章顺序结构程序设计.pptx-资源下载在线文库www.lddoc.cn...

    C语言程序设计第3章 顺序结构程序设计.pptx 第 6章 数组第 7章 函数第 8章 结构体.共用体和枚举类型第 9章 指针第 10章 文件目录页 Contents page第 1章 初识 C语言第 ...

  2. 2020华师c语言程序客观题作业和答案,18秋华师C语言程序设计B在线作业-3辅导资料.docx-资源下载在线文库www.lddoc.cn...

    18秋华师<C语言程序设计B>在线作业-3辅导资料.docx 18秋华师C语言程序设计B在线作业-31.C 2.D 3.D 4.D 5.A 一.单选题共50题,100分1.以下关于运算符优 ...

  3. 四个人三人真一人假c语言,C语言程序设计第4章选择结构.pptx-资源下载在线文库www.lddoc.cn...

    C语言程序设计第4章 选择结构.pptx 第 6章 数组第 7章 函数第 8章 结构体.共用体和枚举类型第 9章 指针第 10章 文件目录页 Contents page第 1章 初识 C语言第 2章 ...

  4. 用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)C语言程序设计在线作业-1辅导资料.docx-资源下载在线文库www.lddoc.cn...

    南开19春学期(1503.1509.1603.1609.1703)<C语言程序设计>在线作业-1辅导资料.docx 南开19春学期(1503.1509.1603.1609.1703)C语言 ...

  5. 天大18年c语言离线作业,天大18秋C语言程序设计在线作业一辅导资料.docx-资源下载在线文库www.lddoc.cn...

    天大18秋<C语言程序设计>在线作业一辅导资料.docx 天大 18 秋C 语言程序设计 在线作业一1.C 2.D 3.D 4.D 5.D 一.单选题共 40 题,100 分1.设有int ...

  6. c语言成颖pdf,程序设计语言开篇导学.ppt-资源下载在线文库www.lddoc.cn

    <程序设计语言>开篇导学.ppt 程序设计语言开篇导学,成颖 教授 博士生导师 南京大学信息管理学院,1.引言,C语言程序设计是计算机相关学科中的一门基础课,也是培养结构化程序设计思想以及 ...

  7. 数值计算方法上机c语言编程,数值计算方法上机实验报告.doc-资源下载在线文库www.lddoc.cn...

    <数值计算方法>上机实验报告.doc 华 北 电 力 大 学实 验 报 告实验名称 数值计算方法上机实验 课程名称 数值计算方法 专业班级电力实 08 学生姓名李超然学 号20080100 ...

  8. 计算机基础c语言试题,计算机应用基础C语言测试题.doc-资源下载在线文库www.lddoc.cn...

    <计算机应用基础C语言>测试题.doc 计算机应用基础C语言测试题一选择题(每空2分,共70分).从下列每题提供的A.B.C.D供选择的答案中,选出一个正确的答案,填在对应的( )内.1在 ...

  9. c程序设计语言的opds书源,汇编语言程序设计第9章子程序设计.ppt-资源下载在线文库www.lddoc.cn...

    汇编语言程序设计 第9章_子程序设计.ppt 2020 2 13 第9章子程序的设计 1 8086 8088和ARM核汇编语言程序设计 第9章子程序设计 2020 2 13 第9章子程序的设计 2 9 ...

最新文章

  1. 《走出软件作坊》书评活动图书奖品名单
  2. 重定向、别名、绝对路径、相对路径 详解
  3. excel中vlookup函数的使用方法_EXCEL中查找匹配函数VLOOKUP使用技巧
  4. perl怎么拷贝一个文件到另一个文件夹中或者怎么拷贝文件夹到另一个文件夹
  5. 如何在 ASP.Net Core 使用 内存缓存
  6. TCP/IP三次握手与四次握手
  7. 【总结整理】写给非技术产品经理的技术能力要求----摘自《人人都是产品经理》...
  8. map函数python返回值,Python中map函数使用
  9. [leetcode]Longest Consecutive Sequence
  10. BNU 背包密码(编码与解密)
  11. 谭浩强c语言第六版答案,C语言谭浩强版本第6章课后练习题答案
  12. 计算机颜色更换,如何给证件照换底色;怎么快速更换证件照底色
  13. S TYLE N E RF: A S TYLE - BASED 3D-A WARE G ENERA - TOR FOR H IGH - RESOLUTION I MAGE S YNTHESIS
  14. java通过poi转换ppt/pptx内容,输出为PNG图片。
  15. Java根据信用卡号区分国际常用的五大信用卡卡种:VISA,Master,AE,DC,JCB.
  16. 新能源车企凶猛下沉,“新车商”会是一条捷径吗?
  17. Android 常见界面控件(简单控件篇)
  18. 选择并遮住工具(边缘调整工具)+剪切蒙版法,扣除头发丝
  19. This Python interpreter is in a conda environment, but the environment hasnot been activated. 如何解决?
  20. 2017百度世界大会 | 爱奇艺创始人CEO龚宇演讲速记

热门文章

  1. python中对list去重的多种方法
  2. 20200207_Dontla_MBTI第二步基本分析报告((ISTJ))
  3. PyQT4编程实例之小财务软件
  4. Divan and a Store 贪心(800)
  5. AcWing算法提高课 Level-3 第四章 高级数据结构
  6. SpringBoot 自定义Kafka消息序列化和反序列化
  7. Oracle 获取字符的位置并截取字符串
  8. Elasticsearch索引映射详解mapping.properties
  9. linux常用命令笔记(持续更新)
  10. java面试换背景颜色_证件照换底色 证件照换背景 证件照背景颜色