变量和函数与静态动态局部和全局
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机C语言核心知识点-变量和函数变量可以在程序中三个地方进行说明: 函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同, 变量可分为局部变量、形式参数和全局变量。从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分的可以有静态存储变量和动态存储变量之分。
一.全局变量和局部变量
C语言中广泛使用局部变量来进行相关的存储的运算。在一个函数模块中定义的变量成为局部变量,我们一般在进入函数的地方进行局部变量的定义,局部变量在定义的时候需要被赋予初始值,否则会是系统被分配的随机值。局部变量的作用范围在函数体内部,每次进行函数的调用的时候,则进行局部变量的定义和分配内存单元。也就是说随着被调用函数体的结束,局部变量会自动消失,内存空间会释放。所以我们可以再不同的函数模块中去定义相同的局部变量。他们之间互相不会影响,在执行完某个函数的时候,会释放相应的存储单元,其他的函数单元也能进行重新定义和开辟存储空间。我们如果要使用函数体内部生成的布局变量的话,一般是通过静态变量来实现。
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
局部变量从存储方式上可分为动态(auto)存储类型和静态(static)存储类型。
动态存储类型的局部变量都是动态的分配存储空间,数据存储在动态存储区(栈)中。函数调用结束后自动释放,生存期是在声明该变量的函数执行过程。
静态存储类型的局部变量则是静态的分配存储空间,数据存储在静态存储区中。在程序整个运行期间都不释放,生存期贯穿于程序运行的整个过程。
函数中的局部变量,如不专门声明为static存储类别,默认都是动态地分配存储空间的,我们在平时的声明变量的过程中auto都是默认省略的。
C语言中也会广泛使用全局变量来进行运算。全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。
全局变量的特点如下:
1. 在程序执行整个过程中它们占据固定的存储单元,而不动态地进行分
配和释放;
2. 如果外部变量不在文件的开头定义,其有效作用域只限于定义处到文
件终。也就是说文件中,在全局变量定义之前的地方需要使用全局变
量,要使用extern这个关键词进行引用才能使用,通常我们把全局变
量定义在文件的开头的地方,作用的范围是整个文件。
3. 全局变量定义了之后如果不赋给初始值的话,系统会自动给全局变量
赋给初始值0。如果是字符型,则会被默认赋值’\0’。全局变量的分配
存储空间在开始执行的时候,结束是在结束的时候,整个过程中一直
占用存储空间,最后结束的时候,会进行资源的释放。
4. 全局变量定义在文件的开头的时候,作用范围为定义处到文件结束的
地方。现在的大型工程一般使用由多个文件构成,那么在其他文件中
需要使用的时候,要用extern进行声明才能够使用。
5. 程序设计的规则是高内聚性和低耦合性,无疑全局变量使得程序之间
的耦合性增强,所以要少用全局变量。同时全局变量增加了系统的内
存的开销。
6. 全局变量可以用引用头文件的方式,也可以用extern关键字,如果
用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将
那个变量写错了,那么在编译期间会报错,如果你用extern方式引
用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接
期间报错。
7. 定义全局变量时,理想的位置是在文件的开头,当这些函数以及同一
个程序中的其他源程序文件中的某些函数需要使用该全局变量时,我
们在函数内部对该变量使用extern 加以说明,说明他是外部的。这
样程序设计比较的清晰。在全部变量的作用范围内的函数直接引用全
局变量。在其他的源文件中,则需要进行全局变量的extern的声明。
8. 在程序中,局部变量可以和全局变量同名。如果要使用全局变量,需
要使用“::”。局部变量可以与全局变量同名,在函数内引用这个
变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编
译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两
个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就
在那个循环体内。
二.静态存储变量和动态存储变量
这里分为static全局变量和普通的全局变量,static局部变量和普通局部变量,他们之间的区别如下:
1. 全局变量的说明之前冠以static,就构成了静态的全局变量。全局变量
本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两
者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作
用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全
局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用
域,即只在定义该变量的源文件内有效,在同一源程序的其它源文
件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,
只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错
误。
2. 从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存
储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了
它的作用域,限制了它的使用范围。
3. 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,
动态申请数据存在于(堆)中。
补充:全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从
变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
如果外部变量不在文件的开头定义,其有效作用域只限于定义处到文件终。
如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。其有效作用域就被拓展到从这个文件extern声明处到文件结束。
如果在全局变量声明的时候,前面加上关键字static,那么其他文件就不能再访问和使用该变量,其有效作用域只限于定义处到文件终。
一般全局变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在代码区。
三.C语言中的变量存储分类指定
1.auto: auto称为自动变量,如果函数不做其他说明的话均为自动变量
2.static:static称为静态变量,根据变量的类型可以分为静态局部变量和静态静态局部变量:它与局部变量的区别在于:在函数退出时,这个变量始终存在,但不能被其它函数使用,当再次进入该函数时,将保存上次的结果。其它与局部变量一样。
静态全局变量:现在大系统一般有许多的文件组成,大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态全程变量就是指只在定义它的源文件中可见而