[局部变量]C语言二级必备知识,全局变量和局部变量,一看就会的C语言知识

引言:
我们知道我们在定义变量的时候 , 一般都是在函数内部定义 , 那么当我们在重新定义一个函数的时候 , 这个变量就不能用了 。那么 , 如何我们在函数之前定义变量会有什么结果呢?这就是变量的作用域问题 , 所以 , 今天这就是我们要说的 。局部变量
定义变量一般有三种形式:
在函数的开头定义
在函数的外部定义
在复合语句中定义
其中在函数的开头和在复合语句中定义的时候 , 只能在函数内部和该复合语句中使用 , 像这种变量称为局部变量 。例如:fun 1 (int a, int b) { int x } fun 2(int c, int d){c=x ; // 错误 , 因为在fun1函数定义的变量在fun2中将无法使用 。}说明:
(1)主函数中定义的变量(如m,n)也只在主函数中有效,并不因为在主函数中定义而在整个文件或程序中有效 。主函数也不能使用其他函数中定义的变量 。
(2)不同函数中可以使用同名的变量,它们代表不同的对象;互不干扰 。例如 , 上面在f1函数中定义了变量x,倘若在f2函数中也定义变量x,它们在内存中占不同的单元,互不混淆 。
(3)形式参数也是局部变量 。例如上面f1函数中的形参a,也只在f1函数中有效 。其他函数可以调用f1 函数,但不能直接引用f1函数的形参a(例如在其他函数中输出a的值是不行的) 。
(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效 , 这种复合语句也称为“分程序”或“程序块” 。
int main ()
{ int a,b;
{ int c;
c=a+b; // c在此复合语句内有效a,b在此范围内有效
}
变量c只在复合语句(分程序)内有效,离开该复合语句该变量就无效,系统会把它占用的内存单元释放 。
全局变量:
我们知道程序的编译单位是源程序文件 , 而一个源程序可以包含若干个函数 。在函数内部定义的变量称为局部变量 , 在函数外部定义的变量成为全局变量 , 也叫全程比变量 。全局变量可以为其他函数所使用 , 他的作用域是从定义到源文件的的结束 。例如:#include
int a=1,b=2;void fun (void ){pritnf ("%d%d",a,b);}int main () {printf (“%d%d”,a,b);retuen 0; } 输出结果是: 1212注意:
为了区分局部变量和全局变量 , 我们通常将全局变量的第一个字母大写 。
但是问题来 , 当我们定义了全局变量之后 , 又在一个函数中 , 定义了同名得到变量 , 那么这个变量的值会是多少呢?是等于全局变量还是等于局部变量呢?
我们看如下程序:#include
int a=1 ,b=2;int main () {int a=5;printf ("%d",a); } 运行结果: 5
[局部变量]C语言二级必备知识,全局变量和局部变量,一看就会的C语言知识
文章图片

文章图片

所以 , 我们可以看出 , 当全局变量和局部变量相同的时候 , 局部变量起作用 。变量的存储方式和生存期:
我们从以上得知 , 有的变量是始终存在的 , 而有的变量是临时存在的 , 只有函数使用到的时候 , 才会被临时分配存储单元 , 但是一旦函数结束 , 储存单元将被释放 , 变量不在存在 。因此 , 我们可以说 , 变量的存储方式分为两种: 动态存储方式和静态存储方式 。
内存中可供用户使用的存储空间可以分为三部分:
程序区
动态存储区
静态存储区
其中全局变量存储在静态存储区 , 从程序开始分配内存空间 , 到程序结束释放内存空间 。而在动态存储区存放一下数据:
函数的形式参数 , 在调用函数的时候给形式参数分配存储空间
自动变量 , 就是没有用static 修饰的变量 。
函数的返回值 。
以上的这些值都是动态分配存储空间的 , 每次调用到他们的时候 , 就临时分配存储空间 , 当使用完就释放 , 一次在同一个程序中 , 利用两次动态变量 , 它的内存地址也可能不同 。


推荐阅读