第18讲 局部变量 全局变量和存储分类 局部变量作用域和生存期
- 格式:ppt
- 大小:256.50 KB
- 文档页数:20
变量的作用域局部变量和全局变量在函数和复合语句内定义的变量,只在本函数或复合语句范围内有效(从定义点开始到函数或复合语句结束),他们称为内部变量或局部变量。
在函数之外定义的变量是外部变量,也称为全局变量(或全程变量)。
如果在一个函数中全局变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即他不起作用,此时局部变量是有效的。
全局变量的作用是增加函数间数据联系的渠道。
虽然全局变量有以上优点,但建议不必要时不要使用全局变量,因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
在程序设计时,对模块的划分要求:内聚性强,与其他模块的耦合性弱,这样便于程序的移植,可读性强。
变量的生存期变量的存储方式分为两种:静态存储方式和动态存储方式。
静态存储方式是指在程序与性能期间由系统在静态存储区分配存储空间的方式,在程序运行器件不释放;而动态存储方式则是在函数调用期间根据需要在动态存储区分配存储空间的方式。
这就是变量的存储区别。
Auto----声明自动变量函数中的形参和在函数中定义的变量都属于此类。
在调用这些函数时,系统给这些变量分配存储空间,函数调用结束时就自动释放这些存储空间。
因为这类局部变量称为自动变量(auto 变量)。
关键字auto作为存储类别的声明。
Auto可省略Static-----声明静态变量希望函数中的变量的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。
这时就用关键字static指定该局部变量为“静态存储变量”。
对静态局部变量的说明静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
而自动变量(即动态局部变量)属于动态存储类别,占胴体啊存储区空间而不占静态存储区空间,函数调用结束后即释放。
对静态局部变量是在编译时赋初值的,即只赋初值一次,在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
变量类型,变量作⽤域,变量存储空间,变量⽣命周期变量类型常量是不可变的值,可以⽤宏来定义,⽐如 #define PI 3.14变量的值是可以变化的,由于编程的不同需求,对变量有各种要求, ⽐如:变量的⽣命周期,变量的初始状态,变量的有效区域(作⽤域),变量的存储地和存储区域的⼤⼩。
为了满⾜这些不同的编程需求,C语⾔发明者设置了以下变量: 1 不同数据类型的变量。
⽐如 char,int,float等。
(变量在内存中占⽤地址⼤⼩由数据类型决定) 2 全局变量 3 局部变量 4 静态变量:包括静态全局变量和静态局部变量 5 寄存器变量 6 外部变量C语⾔中,除了基本类型外,开发者可以通过typedef来定义⾃⼰需要的数据类型。
⽐如: typedef int INT; typedef unsigned int UINT; typedef struct student { char *name; int age; }STUDENT; 如果结构体student不⽤typedef重定义的话,定义结构体变量时:struct student stu1; 使⽤typedef重定义以后,我们只需要STUDENT stu1;即可。
1 全局变量。
在函数外定义,可被所有函数使⽤。
但是在多线程访问时,需要注意多线程安全问题。
2 局部变量。
在函数内部声明。
只有在函数执⾏时,局部变量才存在,函数执⾏完局部变量就消失。
3 静态变量。
分配在内存中的数据段中,在C程序运⾏的整个过程中⼀直保留,静态变量可以定义成静态全局变量和静态局部变量。
①静态全局变量在程序的整个运⾏期间都存储且内存地址不会改变。
②静态局部变量只在声明它的函数内有效,且在下⼀次调⽤时还保留上次调⽤结束时的值(只初始化⼀次)。
4 寄存器变量。
寄存器变量存放在CPU的寄存器中,使⽤寄存器变量⽐内存变量操作速度快得多。
只有整型和字符型变量可以定义为寄存器变量。
一.C语言中,从变量的作用域角度来分,可以分为全局变量和局部变量。
二.变量值存在的时间角度来分,可以分为静态存储方式和动态存储方式。
所谓静态存储方式是指在程序运行期间有系统分配固定的存储空间的方式。
而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
具体包含4种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。
1. 自动的(auto)在调用函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量。
2. 静态的(static)为了满足局部变量的值在函数调用结束后不消失而且保留原值,既占用的存储单元不释放,就出现了静态的局部变量,用static来声明的局部变量。
局部变量的特点:(1)相对自动变量(即动态局部变量),在程序的运行期间都占用静态存储区,直到程序结束才释放该存储区。
(2)静态局部变量只是在程序编译时赋初值,以后每次调用时不再重新赋初值,而只是保留上次函数调用结束时的值。
动态局部变量编译时不赋初值,直到程序调用时才给变量赋值,每次调用都要赋初值。
(3)在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时会自动赋初值0或空字符。
而对动态局部变量,不赋初值则它的值是一个不确定的值,因为动态变量每次都要自动分配存储空间,存储空间的值是不固定的。
(4)静态局部变量在函数调用结束后不释放,但其他函数是不能调用的。
3.寄存器的(register)为了提高程序的执行效率,对一些运算频繁的变量定义为寄存器变量可以节省每次程序执行时的内存读取,大大节省了时间,提高了效率。
寄存器的一些特点:(1)寄存器变量的特点程序运行时分配寄存器存储空间,结束时释放。
这个特点限定了只能把局部自动变量和形式参数定义为寄存器变量。
(2)局部静态变量不能定义为寄存器变量。
4. 外部的(extern)外部变量是在函数的外部定义的全局变量,他的作用是从变量的定义初开始,到本程序文件的末尾。
全局变量、局部变量、静态全局变量、静态局部变量的区别⼀、C++变量根据定义的位置的不同的⽣命周期,具有不同的作⽤域,作⽤域可分为6种:全局作⽤域,局部作⽤域,语句作⽤域,类作⽤域,命名空间作⽤域和⽂件作⽤域。
(1)从作⽤域看:1、全局变量具有全局作⽤域。
全局变量只需在⼀个源⽂件中定义,就可以作⽤于所有的源⽂件。
当然,其他不包含全局变量定义的源⽂件需要⽤extern 关键字再次声明这个全局变量。
2、静态局部变量具有局部作⽤域,它只被初始化⼀次,⾃从第⼀次被初始化直到程序运⾏结束都⼀直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,⽽静态局部变量只对定义⾃⼰的函数体始终可见。
3、局部变量也只有局部作⽤域,它是⾃动对象(auto),它在程序运⾏期间不是⼀直存在,⽽是只在函数执⾏期间存在,函数的⼀次调⽤执⾏结束后,变量被撤销,其所占⽤的内存也被收回。
4、静态全局变量也具有全局作⽤域,它与全局变量的区别在于如果程序包含多个⽂件的话,它作⽤于定义它的⽂件⾥,不能作⽤到其它⽂件⾥,即被static关键字修饰过的变量具有⽂件作⽤域。
这样即使两个不同的源⽂件都定义了相同名字的静态全局变量,它们也是不同的变量。
(2)从分配内存空间看:1、全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,⽽局部变量在栈⾥分配空间2、全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同。
这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下⼀次调⽤的时候还可以保持原来的赋值。
局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。