外部内部变量 作用域

来源:互联网 发布:js冒泡排序 从小到大 编辑:程序博客网 时间:2024/04/30 19:37
外部变量和内部变量
一个C程序就是由一个或多个“外部”对象构成的,它们可能是外部变量或函数。在函数外部定义的变量就叫做外部变量,在函数内部定义(也可以认为在块内定义)的变量叫做内部变量。
函数本身一定是外部的。C语言不允许将函数定义在函数内部,也就是说不可在函数内部再定义函数。函数内部或块内定义的内部变量则只能在函数内部使用。
注意:变量有内部和外部之分,而函数则没有内部和外部之分,所有的函数都是外部函数。

因为外部变量是全局访问的,所以外部变量提供了一种在函数之间进行通信的方法(函数之间还可以通过函数参数和返回值进行数据通信)。在程序中,当函数间信息交流频繁,需要共享大量数据时,将这些共享数据设计为外部变量比通过函数参数传递传出常常更方便。外部变量定义以后,任何函数都可以通过外部变量的名字访问该外部变量,因此函数和函数之间就可以共享这些外部变量。(c++中是通过一个类把这些变量集合)

由于外部变量的作用域范围较大,生命周期与程序运行时间相同,因此外部变量可用于记录一些全局性质的数据。当调用函数时内部变量才在内存中分配内存单元,它们才在内存中存在,当离开函数时它们就会消失,在内存中就不存在了。

变量的作用域规则
组成C程序的函数和外部变量并不需要同时全部编译。程序的源文件可以保存在多个文件中,并且以前编译过的程序还可以直接取出其obj文件通过连接程序连接,然后装载到内存运行。这实际上就是多个源文件分别编译的问题。
那么如何才能实现分别编译呢?应该如何安排外部变量定义语句,以便在编译期间恰当的声明它们呢?外部变量如何初始化?。。。
首先回忆一下变量作用域的含义--变量的作用域就是变量起作用的程序范围
1.文件范围。其作用域开始于文件开头,结束于文件结尾。那些定义于本文件的外部变量和函数具有文件作用域。具有文件作用域的变量或函数如果在定义时使用了static存储属性限定词,那么该变量或函数的作用域将限定在本文件以内;如果在定义外部变量或函数时没有使用static限定词,那么其作用域还可以通过extern声明语句扩展到其他文件。
2.块范围。开始于左大括号“{”,结束于右大括号“}”。在块内定义的内部变量其作用域就在块范围内,包括函数参数。
3.函数原型范围。在函数原型中定义的变量只在函数原型内有效,开始于原型左括号,结束于原形右括号。
4.函数范围。开始于函数体的左大括号“{”,结束于函数体的右大括号“}”。函数范围只适用于标签,标签只可以作为goto语句的目标,标签只能在同一函数内起作用。


在组成程序的所有文件中,外部变量的定义只能有一个。在其他文件区域或本文件该外部变量定义以前的区域,可以通过extern声明该外部变量,声明以后这些区域也可以访问该外部变量。

0 0