C语言中变量作用域
C语言是一种历久弥新的编程语言,虽然出现得比较早,上世纪70年代就已经出现,但在同时代的其他编程语言甚至更晚的一些编程语言已经谢幕后,仍然获得广泛应用,其接近汇编语言的一些特色使其编译效率很高,运行速度也快,在编写计算机底层代码方面有很大优势,特别是在编写硬件资源有限的嵌入式系统程序方面几乎是无可替代的。
对C语言编写的稍大一些的项目来说,往往会包括多个C文件和头文件,有可能会达到数十个甚至上百,有几十甚至数百个函数,只是分配并记住每个函数的功能及作用就会使人头大,更何况其中涉及的各种变量及参数传递,稍不留神就会出现问题。为此,C语言编程中要特别注意变量的作用域。
C语言是一种强类型的编程语言,也就是使用的变量都要声明其类型,也即指明对应内存中的存储空间的大小,变量名也可以认为是一段存储空间的名字。因为不同类型的数据存储空间大小不同,C语言中的变量先声明类型才可以按需要分配其存储空间。因为变量对应的只是一个内存存储空间,其中的值可以随时改变,因此一般情况下都是存储在RAM中。变量按作用域可以分为局部变量与全局变量,还有static变量,一般都在C文件中声明。
1)局部变量:
C语言项目在包含文件多、函数多情况下,难免会出现变量名相同的情况,为了避免出现问题,所以C语言程序原则上都使用局部变量,其他地方即使有相同名字的变量,相互之间也没有任何关系,各自独立起作用。大多数情况下,局部变量是在一个函数中声明并在一个函数中起作用,这是最常见的局部变量使用。
在调用函数时,系统会在栈空间为函数分配一块内存区域,专供此函数使用。每个函数占用的栈空间区域各自独立,互相之间不能访问。当函数调用结束,这块函数占用的栈空间就会被释放。而在函数中定义的变量,就是存放这个函数的栈空间中,因此在外部不能访问,而且也会随着函数调用的结束而消失,这就保证了变量的局部特性。
还有一种作用域更小的局部变量,称为块变量。C语言有用大括号{}括起来的一部分代码,称为程序块,在程序块中声明的变量,只在此程序块中起作用,离开此程序块将不起作用。
2)static变量:
一般情况下,一个函数中声明的变量会在函数调用结束后消失,但有时想保持其值,也就是其占用的存储空间不被释放,这时候就可以使用static来修饰。
一般情况下,函数中声明的变量是存放在此函数分配的栈空间中,但如果使用static,其存储区域就会改为此程序块的静态存储区,这样就能保持其值不变。比如在一个函数中定义一个static变量count,每次调用此函数就会加1计数,这样就可以不使用全局变量而达到计数功能。
还有一种定义在一个C文件前面的static变量,会在整个C文件中起作用,被作为整个C文件所包含的函数的全局变量来使用,但这种变量不会被链接到其他文件中,也就是限定了其作用域只在此C文件之内。
static也可以用来修饰函数,当一个函数声明为static类型的,也只在此C文件中可见可用,其他C文件中不可见不可用。
3)全局变量:
定义在一个C文件前面的变量,作用域是整个C文件,其中包含的函数都可以访问,是此C文件的全局变量。当然,如果在其中某个函数内再声明一个同名变量,这个新声明的变量就是局部变量,与同名的全局变量无关。不过,尽量也不要这样使用,避免造成混淆。
如果在一个C文件中定义了一个全局变量,而其他C文件中的函数也想使用,就需要在那个使用的函数所在的C文件前面也声明这个变量,并加上extern来修饰,这就是说明这是一个在其他C文件中声明的变量而在此使用。
注意,变量声明一般都是放在C文件中,而不要放在头文件中。
对C语言编写的稍大一些的项目来说,往往会包括多个C文件和头文件,有可能会达到数十个甚至上百,有几十甚至数百个函数,只是分配并记住每个函数的功能及作用就会使人头大,更何况其中涉及的各种变量及参数传递,稍不留神就会出现问题。为此,C语言编程中要特别注意变量的作用域。
C语言是一种强类型的编程语言,也就是使用的变量都要声明其类型,也即指明对应内存中的存储空间的大小,变量名也可以认为是一段存储空间的名字。因为不同类型的数据存储空间大小不同,C语言中的变量先声明类型才可以按需要分配其存储空间。因为变量对应的只是一个内存存储空间,其中的值可以随时改变,因此一般情况下都是存储在RAM中。变量按作用域可以分为局部变量与全局变量,还有static变量,一般都在C文件中声明。
1)局部变量:
C语言项目在包含文件多、函数多情况下,难免会出现变量名相同的情况,为了避免出现问题,所以C语言程序原则上都使用局部变量,其他地方即使有相同名字的变量,相互之间也没有任何关系,各自独立起作用。大多数情况下,局部变量是在一个函数中声明并在一个函数中起作用,这是最常见的局部变量使用。
在调用函数时,系统会在栈空间为函数分配一块内存区域,专供此函数使用。每个函数占用的栈空间区域各自独立,互相之间不能访问。当函数调用结束,这块函数占用的栈空间就会被释放。而在函数中定义的变量,就是存放这个函数的栈空间中,因此在外部不能访问,而且也会随着函数调用的结束而消失,这就保证了变量的局部特性。
还有一种作用域更小的局部变量,称为块变量。C语言有用大括号{}括起来的一部分代码,称为程序块,在程序块中声明的变量,只在此程序块中起作用,离开此程序块将不起作用。
2)static变量:
一般情况下,一个函数中声明的变量会在函数调用结束后消失,但有时想保持其值,也就是其占用的存储空间不被释放,这时候就可以使用static来修饰。
一般情况下,函数中声明的变量是存放在此函数分配的栈空间中,但如果使用static,其存储区域就会改为此程序块的静态存储区,这样就能保持其值不变。比如在一个函数中定义一个static变量count,每次调用此函数就会加1计数,这样就可以不使用全局变量而达到计数功能。
还有一种定义在一个C文件前面的static变量,会在整个C文件中起作用,被作为整个C文件所包含的函数的全局变量来使用,但这种变量不会被链接到其他文件中,也就是限定了其作用域只在此C文件之内。
static也可以用来修饰函数,当一个函数声明为static类型的,也只在此C文件中可见可用,其他C文件中不可见不可用。
3)全局变量:
定义在一个C文件前面的变量,作用域是整个C文件,其中包含的函数都可以访问,是此C文件的全局变量。当然,如果在其中某个函数内再声明一个同名变量,这个新声明的变量就是局部变量,与同名的全局变量无关。不过,尽量也不要这样使用,避免造成混淆。
如果在一个C文件中定义了一个全局变量,而其他C文件中的函数也想使用,就需要在那个使用的函数所在的C文件前面也声明这个变量,并加上extern来修饰,这就是说明这是一个在其他C文件中声明的变量而在此使用。
注意,变量声明一般都是放在C文件中,而不要放在头文件中。