第19讲 全局变量及其作用域和生存期 函数的存储分类
- 格式:ppt
- 大小:145.00 KB
- 文档页数:21
C语言中变量储存的类别C语言根据变量的生存周期来划分,可以划分为静态存储方式和动态存储方式。
静态存储方式:是指在程序的运行期间分配固定的存储空间的方式。
静态存储区中存储放了在整个程序执行过程中都存在的变量,如全局变量动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。
动态存储区中存放的变量是根据程序运行需要而进行的需要而建立和释放的。
通常包括:1.函数形式参数;2.自动变量;3.函数调用时的现场保护、4.和返回值地址等。
C语言中的存储类别又分为4类:自动(auto)、静态(static)、动态(extern)寄存器(register)1、用关键字auto定义的变量为自动变量,auto可以省略,auto 不写则隐含定为”自动存储类别“,属于动态存储方式。
2、用static修饰的为静态变量,如果定义在函数内部,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量,注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时,不赋初值的话,则对静态局部变量来说,编译时自动赋初值0.(对数值型变量)或空字符(对字符变量)。
3、为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫”寄存器变量“,用关键字register做声明注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量局部静态变量不能定义为寄存器变量。
4、用extern声明的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量任务:运行结果是x=2;x=4;x=8;x=16;x=32;x=100。
变量的作用域局部变量和全局变量在函数和复合语句内定义的变量,只在本函数或复合语句范围内有效(从定义点开始到函数或复合语句结束),他们称为内部变量或局部变量。
在函数之外定义的变量是外部变量,也称为全局变量(或全程变量)。
如果在一个函数中全局变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即他不起作用,此时局部变量是有效的。
全局变量的作用是增加函数间数据联系的渠道。
虽然全局变量有以上优点,但建议不必要时不要使用全局变量,因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
在程序设计时,对模块的划分要求:内聚性强,与其他模块的耦合性弱,这样便于程序的移植,可读性强。
变量的生存期变量的存储方式分为两种:静态存储方式和动态存储方式。
静态存储方式是指在程序与性能期间由系统在静态存储区分配存储空间的方式,在程序运行器件不释放;而动态存储方式则是在函数调用期间根据需要在动态存储区分配存储空间的方式。
这就是变量的存储区别。
Auto----声明自动变量函数中的形参和在函数中定义的变量都属于此类。
在调用这些函数时,系统给这些变量分配存储空间,函数调用结束时就自动释放这些存储空间。
因为这类局部变量称为自动变量(auto 变量)。
关键字auto作为存储类别的声明。
Auto可省略Static-----声明静态变量希望函数中的变量的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。
这时就用关键字static指定该局部变量为“静态存储变量”。
对静态局部变量的说明静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
而自动变量(即动态局部变量)属于动态存储类别,占胴体啊存储区空间而不占静态存储区空间,函数调用结束后即释放。
对静态局部变量是在编译时赋初值的,即只赋初值一次,在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。
变量的生命周期和作用域在计算机编程中,变量是一个非常重要的概念。
它们用于存储和表示数据,使得程序能够进行各种计算和操作。
然而,变量并不是一直存在的,它们有自己的生命周期和作用域。
生命周期指的是变量从创建到销毁的整个过程。
在程序中,变量的生命周期由其声明和定义的位置决定。
一般来说,变量可以分为全局变量和局部变量。
全局变量是在整个程序中都可见和访问的变量。
它们通常在函数外部声明,并且在任何函数中都可以使用。
全局变量的生命周期从程序开始执行到结束。
这意味着,全局变量的值在程序的不同部分都是可用的,但也容易被误用或滥用。
因此,在使用全局变量时需要谨慎,避免不必要的副作用和混乱。
与全局变量相对应的是局部变量。
局部变量是在函数内部声明的变量,它们只在所属函数中可见和访问。
局部变量的生命周期仅限于其所属函数的执行过程。
一旦函数执行完毕,局部变量就会被销毁,其所占用的内存空间也会被释放。
这种限制使得局部变量更加安全和可控,避免了变量的冲突和混淆。
除了生命周期,变量还有作用域的概念。
作用域指的是变量在程序中有效的范围。
在大多数编程语言中,作用域可以分为全局作用域和局部作用域。
全局作用域意味着变量在整个程序中都可见和访问。
在全局作用域中声明的变量可以被程序中的任何函数使用。
这种作用域通常用于需要在多个函数中共享数据的情况。
然而,全局作用域也容易导致变量的滥用和混淆,因此需要谨慎使用。
与全局作用域相对应的是局部作用域。
局部作用域意味着变量只在其所属的函数或代码块中可见和访问。
在局部作用域中声明的变量只能在其所属的函数或代码块中使用,无法被其他函数或代码块访问。
这种作用域的好处是可以限制变量的可见性和访问范围,提高程序的安全性和可维护性。
在一些编程语言中,还存在着块级作用域的概念。
块级作用域是指由一对花括号({})括起来的代码块中声明的变量。
这些变量只在该代码块中有效,超出该代码块范围后就会被销毁。
块级作用域的引入使得变量的作用域更加灵活和可控。
变量的作用域和生命周期在计算机编程中,变量是用来存储和表示数据的一种基本概念。
变量的作用域和生命周期是编程语言中非常重要的概念,它们决定了变量在程序中的可见性和存在时间。
作用域是指变量在程序中的可见范围。
在不同的编程语言中,作用域可以分为全局作用域和局部作用域。
全局作用域意味着变量在整个程序中都是可见的,而局部作用域则只在特定的代码块或函数中可见。
在大多数编程语言中,变量的作用域由它们的声明位置决定。
例如,在C语言中,变量的作用域可以是函数内部或函数外部。
在函数内部声明的变量只在该函数内部可见,而在函数外部声明的变量则在整个程序中都是可见的。
作用域的概念对于程序的可读性和可维护性非常重要。
通过合理地定义变量的作用域,可以避免命名冲突和意外的数据修改。
同时,作用域的概念也有助于程序员理解代码的执行过程和变量的使用方式。
除了作用域,变量还有一个重要的概念是生命周期。
生命周期指的是变量存在的时间范围。
在程序执行过程中,变量可以被创建、修改和销毁。
变量的生命周期也与其作用域密切相关。
在局部作用域中声明的变量通常具有较短的生命周期,它们在离开作用域时会被销毁。
这样可以释放内存资源,并避免不必要的数据存储。
相比之下,全局作用域中声明的变量通常具有较长的生命周期,它们在整个程序执行过程中都存在。
这些变量可以被多个函数或代码块访问和修改,但也需要注意避免滥用全局变量,以免导致代码的可读性和可维护性下降。
在一些编程语言中,还存在其他类型的作用域和生命周期。
例如,面向对象编程中的类成员变量具有类作用域和对象生命周期。
这些变量在类的所有对象中都是可见的,它们的生命周期与对象的创建和销毁相关。
总结起来,变量的作用域和生命周期是编程语言中非常重要的概念。
通过合理地定义变量的作用域和生命周期,可以提高程序的可读性、可维护性和性能。
在编程过程中,我们应该根据实际需求和编程语言的规范来选择合适的作用域和生命周期,以实现代码的正确性和效率。
C语言的变量的作用域和生存期一、c程序存储空间布局C程序一直由下列部分组成:1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储分。
|-----------|| ||-----------|| 栈 ||-----------|| | || /|/ || || || /|/ || | ||-----------|| 堆 ||-----------|| 未初始化 ||-----------|| 初始化 ||-----------|| 正文段 ||-----------|二、面向过程程序设计中的static1. 全局静态变量在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在) 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)3)作用域:全局静态变量在声明他的文件之外是不可见的。
准确地讲从定义之处开始到文件结尾。
看下面关于作用域的程序://teststatic1.cvoid display();extern int n;int main(){n = 20;printf("%d/n",n);display();return 0;}//teststatic2.cstatic int n; //定义全局静态变量,自动初始化为0,仅在本文件中可见void display(){n++;printf("%d/n",n);}文件分别编译通过,但link的时候teststatic1.c中的变量n找不到定义,产生错误。
c语言之生命周期/存储类1、概念解析1.1、存储类存储类:就是存储类型。
变量空间开辟于内存之中,存储类就是用于描述变量空间开辟于内存中什么地方。
事实上内存被分为了,栈、堆、数据段、bss段、.text段等不同管理方法的内存段,变量空间就开辟于这些内存段中。
譬如局部变量被分配在栈中,那么它的存储类就是栈。
又比如被显示初始化为非0的全局变量分配在data段,那么该全局变量的存储类就是data段。
又比如显式初始化为0和没有显示初始化(默认为0)的全局变量以及静态变量分配在bss段,该变量的存储类就是bss。
同理当变量空间在其它段时,那么它的存储类就是该存储段。
1.2、作用域(1)作用域是描述这个变量起作用的代码范围。
(2)基本来说,C语言变量的作用域规则是代码块作用域。
意思就是这个变量起作用的范围是当前的代码块。
代码块就是一对大括号{}括起来的范围,所以一个变量的作用域为这个变量定义所在的{}范围内从这个变量定义开始往后的部分。
以下两个例子可以帮助更好的理解作用域:1.3、生命周期生命周期是描述这个变量什么时候诞生,什么时候死亡,也即是运行时分配内存空间给这个变量,使用后收回这个内存空间,此后内存地址已经和这个变量无关了。
变量和内存的关系,就和人(变量)去图书馆借书(内存)一样。
变量的生命周期就好象我人借书的这段周期一样。
研究变量的生命周期可以帮助我们理解程序在运行时的一些特殊现象。
1.4、链接属性程序从源代码到最终可执行程序,经历的过程为预编译、编译、汇编和链接。
其中编译的目的就是把源代码翻译成xx.o 的目标文件,目标文件里面有很多符号和代码段、数据段、bss 段等分段。
符号就是编程中的变量名、函数名等。
运行时变量名、函数名能够和相应的内存对应起来,靠符号来做链接的。
xxx.o 的目标文件链接生成最终可执行程序的时候,其实就是把符号和相对应的段给链接起来。
C 语言中的符号有三种链接属性:外连接属性、内链接属性、无连接属性。
C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)8.8局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。
这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。
这种变量有效性的范围称变量的作用域。
不仅对于形参变量,C语言中所有的量都有自己的作用域。
变量说明的方式不同,其作用域也不同。
C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
8.8.1局部变量局部变量也称为内部变量。
局部变量是在函数内作定义说明的。
其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
例如:int f1(int a) /*函数f1*/{int b,c;……}a,b,c有效int f2(int x) /*函数f2*/{int y,z;……}x,y,z有效main(){int 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)在复合语句中也可定义变量,其作用域只在复合语句范围内。
例如:main(){int s,a;……{int b;s=a+b;……/*b作用域*/}……/*s,a作用域*/}【例8.12】main(){int i=2,j=3,k;{int k=8;printf("%d\n",k);}printf("%d\n",k);}本程序在main中定义了i,j,k三个变量,其中k未赋初值。