计算机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称为静态变量,根据变量的类型可以分为静态局部变量和静态静态局部变量:它与局部变量的区别在于:在函数退出时,这个变量始终存在,但不能被其它函数使用,当再次进入该函数时,将保存上次的结果。
其它与局部变量一样。
静态全局变量:现在大系统一般有许多的文件组成,大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。
静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。
它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。
extern :extern称为外部变量。
为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用。
因此, 必须将全程变量通知每一个程序模块文件, 此时可用extern来说明。
四,寄存器变量Register:register称为寄存器变量。
它只能用于整型和字符型变量。
定义符register说明的变量被C编译器存储在CPU的寄存器中, 而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。
但是C编译器只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。
因此, 寄存器变量常用在同一变量名频繁出现的地方。
另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量, 因此, 不能用作全程变量。
定义一个整型寄存器变量可写成:register int a;对于以上所介绍的变量类型和变量存储类型将会在以后的学习中, 通过例行程序中的定义、使用来逐渐加深理解。
程序的内存区域并不是所有的变量时时刻刻都是可知的。
一些变量在整个程序中都是可见的,它们称为全局变量。
一些变量只能在一个函数中可知,称为局部变量。
要了解变量的这些属性,应先弄清程序在内存中的分布区域,见图5-2。
图5-2 程序在内存中的区域一个程序将操作系统分配给其运行的内存块分为4个区域:(1)代码区,存放程序的代码,即程序中的各个函数代码块。
(2)全局数据区,存放程序的全局数据和静态数据。
(3)堆区,存放程序的动态数据。
(4)栈区,存放程序的局部数据,即各个函数中的数据。
五.静态函数与普通函数static函数与普通函数作用域不同,仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
静态全局变量与普通全局变量的区别在于:静态全局变量的作用域仅限于所在的源文件。
相关的总结:1.static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;2.static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;3.static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.4.一般全局变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在代码区。
5.栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率>有一定降低。
栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。
不同堆分配的内存无法互相操作。
栈空间分静态分配和动态分配两种。
静态分配是编译器完成的,比如自动变量(auto)的分配。
动态分配由alloca 函数完成。
栈的动态分配无需释放(是自动的),也就没有释放函数。
为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹>配是良好程序的基本要素。
堆是程序员管理的,栈是系统管理的。
6.静态变量的特点:一次存储:静态局部变量只被初始化一次,下一次初始化根据上一次的结果值,有点类似于c++中类的静态成员变量,即无论该类型生成多少个实例对象,所有的对象共用一个静态变量,到这里就是无论这个函数调用多少次,该静态变量只初始化一次,并没有因为超出其生存期而被销毁,只是外部不可见而已,用个例子说明之:void fun1( int v ){static int value = v;static int value = v;a)对于函数而言,任何用static修饰的函数,其作用域仅为当前源文件,而对外部来说这个函数是不可见的,即只有和其在同一源文件中的函数才能调用这个静态函数;反过来说,如果一个函数仅仅被同一源文件中的其他函数调用,那么这个函数应该声明为静态的,这样做的好处在于:可以一定程度上的解决不同源文件之间函数的命名冲突问题;b)对于变量而言,static修饰的全局变量,只在当前源文件中有效,对外部不可见,外部文件不能够引用;顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字“extern”引用“外部”的变量。