全局变量和局部变量
- 格式:doc
- 大小:25.50 KB
- 文档页数:7
全局变量与局部变量1.全局变量:⽆缩进的变量,在整个代码中任意位置都可以调⽤2.局部变量:在⼦程序中设置的有缩进的变量,只能在⼦程序中调⽤3.局部变量与全局变量重名时,互相不影响,局部变量总是先从⾃⼰等层次的代码块中寻找,找不到在从外⾯⼀层找4.⼀般全局变量设置成⼤写形式,⽽局部变量设置成⼩写,便于区分5.例⼀:1def test():2print(name)3 test() #输出‘alex’name = 'alex'def test():name = 'pig'print(name)test() #输出pig6.在⼦程序中想修改全局变量时,可引⼊ globalname = 'alex'def test():global namename = 'pig'print(name)test() #输出pig7.函数嵌套name = 'alex'def test():name = 'pig'def test_1():name_1 = 'cat'print(name_1)def test_2():name_2 = 'dog'print(name_2)test_2()print(name)test_1()test() #依次输出pig,cat,dog8.前向引⽤:函数即变量函数之间互相引⽤时,不在乎函数的顺序,因为调⽤时均在内存⾥,但是由于执⾏命令是有顺序,执⾏的命令应在所涉及的所有函数之后,否则读取不到,会报错。
如:1def test():2 name = 'Mike'3print(name)4 test_1()5def test_1():6 name = 'John'7print(name)8test()9def test_1():10 name = 'John'11print(name)12def test():13 name = 'Mike'14print(name)15 test_1()16test()17def test():18 name = 'Mike'19print(name)20 test_1()21test()22def test_1():23 name = 'John'24print(name) #会报错,上⾯两个输出⼀样9.改变上⼀级变量,使⽤ nonlocaldef test():name = 'John'print(name)def test_1():nonlocal namename = 'Mary'print(name)test_1()test() #输出John,Mary10.全局变量不管在哪个⼦程序中始终可以修改(global形式)。
c语言全局变量和局部变量区别
全局变量和局部变量的区别有:1.有效范围不一样,2.内存空间不同,3.使用区间不同。
局部变量只在本函数范围有效,在此函数以外是不能使用这些变量;全局变量的有效范围是从定义变量的位置开始到本源文件结束。
局部变量是程序运行到该函数时给该变量分配内存空间,函数结束则释放该内存空间。
全局变量是程序运行时事先分配内存空间,当程序结束时释放内存。
全局变量:作用于整个程序文件;局部变量:作用于所属语句块或函数中。
全局变量的存有主要存有以下一些原因:采用全局变量可以挤占更多的内存(因为其生命期短),不过在计算机布局很高的今天,这个不必须算什么问题,除非采用的就是非常大对象的全局变量,能避免就一定必须防止。
采用全局变量程序运行时速度更慢一些(因为内存不须要再分配),同样也慢没法多少。
对于局部变量的名字空间污染,这个在不能采用太多变量时就是可以防止的。
当全局变量与局部变量下文的时候,起至促进作用的就是局部变量,全局变量被屏蔽掉。
还可以用extern在函数外对全局变量声明,并使全局变量的作用域从声明处至文件的完结。
全局变量的优先度高于局部变量。
总之,全局变量可以采用,但是全局变量采用时应特别注意的就是尽可能并使其名字不易认知,而且无法太短,防止名字空间的污染;防止采用非常大对象的全局变量。
在c语言等面向过程语言中,局部变量可以和全局变量下文,但是局部变量可以屏蔽全局变量。
在函数内提及这个变量时,可以使用同名的局部变量,而不能使用全局变量。
全局变量和局部变量的定义1、局部变量:定义在函数内部的变量就是局部变量,只能在其被声明的函数内部被访问。
这样的变量只在函数运⾏时存在,⼀旦退出函数,这些局部变量就都被销毁。
所有在函数内部声明的变量名称都将被加⼊作⽤域中。
⽰例如下:def printInfo(arg1, arg2) :sum = arg1 + arg2print "函数中的sum = ",sum#函数体外也定义了⼀个sum变量printInfo(5,6)sum = 1print "函数外的sum = ",sum运⾏结果如下:函数中的sum = 11函数外的sum = 1函数中的sum变量就是局部变量,只能在所在的函数中访问,即使在外⾯改变了sum变量的值,也不会影响函数中的sum变量的值。
2、全局变量:全局变量是在函数外定义的,可以在整个程序范围内访问,但是必须在所要访问的函数中使⽤关键词 global 声明函数外的变量为全局变量,这样访问的才是在函数外定义的全局变量。
⽰例代码:def printInfo(y) :global xsum = x + yprint "sum = ",sumx = 10printInfo(5)运⾏结果:sum = 15⼀旦变量被定义为全局变量后,在程序任何地⽅都可以访问,也可以修改。
所以我们不建议过多的使⽤全局变量(⾮必要不使⽤),因为这样可能会导致全局变量的不可预知性,并且全局变量也降低了函数或模块之间的通⽤性,同时也降低了代码的可读性,别⼈有可能不知道这个调⽤的是哪的变量。
全局变量与局部变量全局变量与局部变量:全局变量与局部变量两者的本质区别就是在于作⽤域⽤通俗的话来理解的话,全局变量是在整个py⽂件中声明,全局范围内都可以访问局部变量是在某个函数中声明的,只能在该函数中调⽤它,如果试图在超出范围的地⽅调⽤,程序就爆掉了如果在函数内部定义与某个全局变量⼀样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。
因此不建议这样使⽤,这样会使得程序很不健全作⽤域name = '张望';def func():name1= '诗仙'print('全局变量为:',name,'\n局部变量为:',name1)func()# 执⾏结果全局变量为:张望局部变量为:诗仙print("函数外直接打印全局变量:",name)# 函数外直接打印全局变量:张望print('函数外直接打印局部变量':name1) # 报错了,局部变量作⽤域仅在函数内部就近原则name = '张望';def func():name= '诗仙'print('全局变量为:',name)func()#执⾏结果:全局变量为:诗仙#当局部变量与全局变量⼀样时,取⽤就近原则,优先获取函数内部距离最近的变量,,如果没有再向外获取name = '张望';def func():#name= '诗仙'print('全局变量为:',name)func()#执⾏结果: 全局变量为:张望#函数内部没有,向外获取global关键字name = '张望';def func():global namename = '诗仙'print('全局变量为:',name)func()print('函数外打印全局变量:',name)# 执⾏结果:全局变量为:诗仙函数外打印全局变量: 诗仙# 使⽤global关键字就是告诉python编译器这个变量不是局部变量⽽是全局变量,其实有点像是"引⽤"的意思,可以简单理解为,此时 global name 就是全局变量 namenonlocal关键字字⾯意思就是指当前的这个变量不是局部变量。
C语言中的局部变量和全局变量在C语言中,局部变量和全局变量是两种不同的变量类型,它们分别用于特定的程序设计需求。
本文将介绍局部变量和全局变量的定义、作用域以及在使用中的注意事项。
一、局部变量的定义和作用域局部变量是在函数内部声明的变量,它们只能在其所在的函数内部使用。
当函数被调用时,局部变量会在内存中被分配空间,当函数执行完毕后,局部变量所占用的内存会被释放。
局部变量的定义方式为在函数内部声明变量的语句前加上数据类型。
局部变量的作用域仅限于所在的函数内部。
这意味着其他函数无法直接访问同一名称的局部变量。
每个函数都有自己独立的局部变量,它们之间不会相互干扰。
局部变量的作用域可以有效地避免命名冲突,提高代码的可读性和可维护性。
二、全局变量的定义和作用域全局变量是在函数外部声明的变量,它们在整个程序中都可以被访问和使用。
全局变量的定义方式为在所有函数外部声明变量的语句前加上关键字"extern"和数据类型。
全局变量的作用域跨越整个程序,它们在程序开始执行时分配内存,在程序结束时释放内存。
全局变量可以在多个函数中共享数值,这对于需要在不同函数之间进行数据传递和共享的场景非常有用。
然而,全局变量的使用也需要谨慎。
过多的全局变量会增加程序的复杂性,不利于代码的维护和调试。
全局变量的值可以被任何函数修改,如果使用不当,可能会导致数据混乱和错误的结果。
三、局部变量和全局变量的差异1. 作用域:局部变量仅在函数内部可见,全局变量在整个程序中可见。
2. 生命周期:局部变量在函数执行期间存在,函数执行完毕后消失;全局变量在程序执行期间一直存在。
3. 访问限制:局部变量只能在定义它们的函数内部访问,其他函数无法直接访问;全局变量可以被所有函数访问。
4. 冲突风险:局部变量具有更小的命名冲突风险,全局变量存在更大的命名冲突可能性。
四、局部变量和全局变量的使用注意事项1. 命名冲突:在使用局部变量和全局变量时,应当避免重复使用相同的变量名,以防止命名冲突和代码混乱。
局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。
局部变量和全局变量的区别1.定义的位置不同:
局部变量定义在⽅法内部。
成员变量定义在⽅法的外部,直接在类中。
2.作⽤范围不同:
局部变量只有在⽅法当中才能使⽤,出了⽅法就不能⽤了。
成员变量在整个类中全都可以使⽤。
3.默认值不同:
局部变量没有默认值,如果想要使⽤,必须要⼿动进⾏赋值。
成员变量如果没有赋值会有默认值,规则和数组⼀样。
4.⽣命周期不同:
局部变量随着⽅法进栈⽽诞⽣,随着⽅法的出栈⽽消失。
成员变量随着对象的创建⽽诞⽣,随着对象被垃圾回收机制回收⽽消失。
1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C 文件中对此变量赋初值,此时连接不会出错。
4、语句for( ;1 ;)有什么问题?它是什么意思?答:无限循环,和while(1)相同。
5、do……while和while……do有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环。
6、请写出下列代码的输出内容#i nclude<stdio.h>main(){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:10,12,1201.static有什么用途?(请至少说明两种)1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
C语言的变量一、全局变量和局部变量按照变量的有效作用范围可划分为局部变量和全局变量。
局部变量是在一个函数内部定义的变量,该变量只在定义它的那个函数范围以内有效,在此函数之外局部变量就失去意义了,因而也不能使用这些变量了。
不同的函数可以使用相同的局部变量名,由于他们的作用范围不同,不会相互干扰。
函数的形式参数也属于局部变量。
在一个函数内部的复合语句中也可以定义局部变量,该局部变量只在该复合语句中有效。
全局变量是在函数外部定义的变量,又称外部变量。
全局变量可以为多个函数共同使用,其有效的作用范围是从它定义的位置开始到整个程序文件结束为止。
如果全局变量定义在一个程序文件的开始处,则在整个程序文件范围内都可以使用它。
如果一个全局变量不是在程序文件的开始处定义的,但又希望在它的定义点之前的函数中引用该变量,这时应该在引用该变量的函数中用关键字extern将其说明为“外部变量”。
另外,如果在一个程序模块文件中引用另一个程序模块文件中定义的变量时,也必须用extern进行说明。
外部变量说明与外部变量定义是不同的。
外部变量定义只能有一次,定义的位置在所有函数之外,而同一个程序文件中的外部变量说明可以有多次,说明的位置在需要引用该变量的函数之内。
外部变量说明的作用只是声明该变量是一个已经在外部定义过了的变量而已。
如果在同一个程序文件中,全局变量与局部变量同名,则在局部变量的有效作用范围之内,全局变量是不起作用的,也就是说,局部变量的优先级比全局变量的高。
在编写C语言程序时,不是特别需要的地方就不要使用全局变量,二应当尽可能的使用局部变量。
这是因为局部变量只有在使用它时,才为其分配内存单元,二全局变量在整个程序的执行过程中都要占用内存单元。
另外,如果使用全局变量过多,在各个函数执行时都有可能改变全局变量的值,使人们难以清楚的判断出在各个程序执行点处全局变量的值,这样会降低程序的通用性和可读性。
还有一点需要说明,如果程序中的全局变量在定义时赋给了初值,按ANSI C标准规定,在程序进入主函数之前必须先对该全局变量进行初始化。
局部变量与全局变量1.局部变量以前定义变量的语句都是出现在某一函数中,这种变量称为局部变量。
主函数中定义的变量,用户自定义函数中的形参变量,自定义函数体内定义的变量都是局部变量。
局部变量的作用只限定在它的函数内,一个函数的局部变量不能出现在其它函数中。
局部变量在程序被编译时不会分配内存空间,只有当执行调用该函数的语句时,系统为局部变量分配内存,运行结束后,局部变量会释放它占有的内存单元,该内存单元再被操作系统回收,以备再用。
这种性质可以提高内存的利用率。
有时候,局部变量也可以定义在函数体内的复合语句中,但其作用只限于该复合语句,例如:int smd(int x,int y){int i,j;...{int k;...}...}其中变量k就是定义在复合语句中的局部变量,只在复合语句中起作用。
2.全局变量在所有函数之外定义的变量称作全局变量。
在一个c语言源程序文件中,全局变量可以定义在所有函数之前,也可以定义在所有函数之后,还可以定义在任意两个函数之间。
一般情况下,定义全局变量放在文件开头所有函数的前面。
如果全局变量在定义时没有被初始化,系统自动初始化为0(char型的为'/0')。
再者注意,与局部变量相对应,全局变量在被编译时就分配了内存空间,一直保持到程序运行结束。
全局变量从定义之处到文件结束的所有函数都可以访问它,使用其当前值,或者改变其当前值,全局变量的值一旦改变,就保持这个新值,直到下一次改变。
全局变量的性质使得它能够在函数之间传递数据。
例如:在自定义函数与主函数之前,定义全局变量s l,其使用贯穿整个文件。
3.变量同名问题同一个程序内的全局变量不能同名,同一个人函数内的局部变量也不能同名。
但是,不同的函数的局部变量可以同名(两个函数不能同时被调用),同一个程序内的全局变量与它作用域内函数的局部变量也可以同名(起作用的是局部变量,全局变量被屏蔽掉)。
4.修饰符extern与static对全局变量和函数的修饰作用①.extern与static对全局变量的修饰如果c程序是由多个文件组成的,则其中一个文件中定义的全局变量的作用域从定义之处到本文件末。
c语⾔局部变量静态局部变量全局变量与静态全局变量基本概念:作⽤域:起作⽤的区域,也就是可以⼯作的范围。
代码块:所谓代码块,就是⽤{}括起来的⼀段代码。
数据段:数据段存的是数,像全局变量就是存在数据段的代码段:存的是程序代码,⼀般是只读的。
栈(stack):先进后出。
C语⾔中局部变量就分配在栈中。
局部变量 普通的局部变量定义的时候直接定义或者在前⾯加上autovoid func1(void){int i = 1;i++;printf("i = %d.\n", i);}局部变量i的解析:在连续三次调⽤func1中,每次调⽤时,在进⼊函数func1后都会创造⼀个新的变量i,并且给它赋初值1,然后i++时加到2,然后printf输出时输出2.然后func1本次调⽤结束,结束时同时杀死本次创造的这个i。
这就是局部变量i的整个⽣命周期。
下次再调⽤该函数func1时,⼜会重新创造⼀个i,经历整个程序运算,最终在函数运⾏完退出时再次被杀死。
静态局部变量(static)静态局部变量定义时前⾯加static关键字。
总结:1、静态局部变量和普通局部变量不同。
静态局部变量也是定义在函数内部的,静态局部变量定义时前⾯要加static关键字来标识,静态局部变量所在的函数在多调⽤多次时,只有第⼀次才经历变量定义和初始化,以后多次在调⽤时不再定义和初始化,⽽是维持之前上⼀次调⽤时执⾏后这个变量的值。
本次接着来使⽤。
2、静态局部变量在第⼀次函数被调⽤时创造并初始化,但在函数退出时它不死亡,⽽是保持其值等待函数下⼀次被调⽤。
下次调⽤时不再重新创造和初始化该变量,⽽是直接⽤上⼀次留下的值为基础来进⾏操作。
3、静态局部变量的这种特性,和全局变量⾮常类似。
它们的相同点是都创造和初始化⼀次,以后调⽤时值保持上次的不变。
不同点在于作⽤域不同全局变量定义在函数外⾯的变量,就叫全局变量。
普通全局变量普通全局变量就是平时使⽤的,定义前不加任何修饰词。
c语言全局变量和局部变量区别首先要理解什么是全局变量和局部变量,然后再理解如何使用全局变量和局部变量。
一、什么是全局变量和局部变量全局变量:全局变量是指可以定义在文件或目录中的所有变量。
如果想知道程序中所有的局部变量和全局变量,就需要定义一个目录,把每个局部变量都放进去,这样就能查看所有局部变量了。
但在不同的程序中,不能在同一个目录下定义相同名字的变量,因为同名的变量会覆盖另外一个变量。
但如果两个同名的变量没有被覆盖,那这两个变量就不会互相干扰。
局部变量:局部变量是只存储在内存中的变量,一般只存储一个数据项,不占用整个内存。
它们仅仅是一些信息,在函数或过程调用时提供给该函数或过程,不包含任何实际数据。
1、与局部变量相比全局变量的修改仅影响到程序中的一处,而且还可能不被发现,所以尽量少用或不用全局变量,只要少量地用一些即可。
例如一些外部数据,在函数中参数传递、返回值传递等场合下应该用全局变量。
2、在使用全局变量时要考虑它对整个程序的影响,如果在一个函数中使用了全局变量,在返回时,有可能改变全局变量的值;此外在多个函数中,不能在同一个目录下使用相同的全局变量,否则可能导致程序混乱,错误增加。
二、使用全局变量的原则3、在声明全局变量之前必须确保其他类也已经声明过全局变量。
即,如果在定义变量时,所在的类声明了一个全局变量,那在定义类的其他成员时也必须声明相应的全局变量。
如果要定义一个带有两个头文件的程序,必须指定两个文件,第一个文件只定义一个头文件,第二个文件定义一个头文件和一个尾文件,将第二个文件的定义放在第一个文件的后面,以便在运行时将两个文件统一。
在同一个头文件中声明的全局变量,在不同的头文件中可以有不同的值,即可以同名,但不能同值。
所以必须在定义该全局变量的头文件中使用变量的定义,然后再声明其他的头文件。
4、如果在定义一个全局变量后,又声明了它的子类,那么在子类中就不允许再定义该全局变量。
5、对于同一个类的成员来说,一般不能跨类型使用全局变量,但当使用的是静态的全局变量时,不受此限制。
全局变量与局部变量的区别2009-11-15 10:12一、变量的分类变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。
局部变量的值不可知。
静态全局变量,只本文件可以用。
全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束.省略了存储类型符,系统将默认为是自动型.静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存.自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的. 二、介绍变量的作用域在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。
这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。
这种变量有效性的范围称变量的作用域。
不仅对于形参变量,C语言中所有的量都有自己的作用域。
变量说明的方式不同,其作用域也不同。
C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
一、局部变量局部变量也称为内部变量。
局部变量是在函数内作定义说明的。
其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
例如: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. 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
如在例5.3 中,形参和实参的变量名都为n,是完全允许的。
4. 在复合语句中也可定义变量,其作用域只在复合语句范围内。
例如:main(){int s,a;……{int b;s=a+b;……b作用域}……s,a作用域}[例5.11]main(){int i=2,j=3,k;k=i+j;{int k=8;if(i==3) printf("%d\n",k);}printf("%d\n%d\n",i,k);}main(){k=i+j;{int k=8;if(i=3) printf("%d\n",k);}printf("%d\n%d\n",i,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。
二、全局变量全局变量也称为外部变量,它是在函数外部定义的变量。
它不属于哪一个函数,它属于一个源程序文件。
其作用域是整个源程序。
在函数中使用全局变量,一般应作全局变量说明。
只有在函数内经过说明的全局变量才能使用。
全局变量的说明符为extern。
但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
例如:int a,b; /*外部变量*/void f1() /*函数f1*/{……}float x,y; /*外部变量*/int fz() /*函数fz*/{……}main() /*主函数*/{……}/*全局变量x,y作用域全局变量a,b作用域*/从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。
但x,y 定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。
a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。
[例5.12]输入正方体的长宽高l,w,h。
求体积及三个面x*y,x*z,y*z的面积。
int vs( int a,int b,int c){int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;}main(){int v,l,w,h;printf("\ninput length,width and height\n");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d s1=%d s2=%d s3=%d\n",v,s1,s2,s3);}本程序中定义了三个外部变量s1,s2,s3,用来存放三个面积,其作用域为整个程序。
函数vs用来求正方体体积和三个面积,函数的返回值为体积v。
由主函数完成长宽高的输入及结果输出。
由于C语言规定函数返回值只有一个,当需要增加函数的返回数据时,用外部变量是一种很好的方式。
本例中,如不使用外部变量,在主函数中就不可能取得v,s1,s2,s3四个值。
而采用了外部变量,在函数vs中求得的s1,s2,s3值在main 中仍然有效。
因此外部变量是实现函数之间数据通讯的有效手段。
对于全局变量还有以下几点说明:1. 对于局部变量的定义和说明,可以不加区分。
而对于外部变量则不然,外部变量的定义和外部变量的说明并不是一回事。
外部变量定义必须在所有的函数之外,且只能定义一次。
其一般形式为:[extern] 类型说明符变量名,变量名… 其中方括号内的extern可以省去不写。
例如:int a,b;等效于:extern int a,b;而外部变量说明出现在要使用该外部变量的各个函数内,在整个程序内,可能出现多次,外部变量说明的一般形式为:extern 类型说明符变量名,变量名,…;外部变量在定义时就已分配了内存单元,外部变量定义可作初始赋值,外部变量说明不能再赋初始值,只是表明在函数内要使用某外部变量。
2. 外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,因而使得函数的独立性降低。
从模块化程序设计的观点来看这是不利的,因此在不必要时尽量不要使用全局变量。
3. 在同一源文件中,允许全局变量和局部变量同名。
在局部变量的作用域内,全局变量不起作用。
[例5.13]int vs(int l,int w){extern int h;int v;v=l*w*h;return v;}main(){extern int w,h;int l=5;printf("v=%d",vs(l,w));}int l=3,w=4,h=5;本例程序中,外部变量在最后定义,因此在前面函数中对要用的外部变量必须进行说明。
外部变量l,w和vs函数的形参l,w同名。
外部变量都作了初始赋值,mian函数中也对l作了初始化赋值。
执行程序时,在printf语句中调用vs函数,实参l的值应为main中定义的l值,等于5,外部变量l在main内不起作用;实参w的值为外部变量w的值为4,进入vs后这两个值传送给形参l,wvs函数中使用的h 为外部变量,其值为5,因此v的计算结果为100,返回主函数后输出。
变量的存储类型各种变量的作用域不同,就其本质来说是因变量的存储类型相同。
所谓存储类型是指变量占用内存空间的方式,也称为存储方式。
变量的存储方式可分为“静态存储”和“动态存储”两种。
静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。
5.5.1节中介绍的全局变量即属于此类存储方式。
动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。
典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。
如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。
从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。
生存期表示了变量存在的时间。
生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。
一个变量究竟属于哪一种存储方式,并不能仅从其作用域来判断,还应有明确的存储类型说明。
在C语言中,对变量的存储类型说明有以下四种:auto自动变量register 寄存器变量extern 外部变量static 静态变量自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。
在介绍了变量的存储类型之后,可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。
因此变量说明的完整形式应为:存储类型说明符数据类型说明符变量名,变量名…;例如:static int a,b; 说明a,b为静态类型变量auto char c1,c2; 说明c1,c2为自动字符变量static int a[5]={1,2,3,4,5}; 说明a为静整型数组extern int x,y; 说明x,y为外部整型变量。
总结与区别:变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
从作用域看:全局变量具有全局作用域。
全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。