备注:1、文章中的例子暂时为空,日后希望自己能自己编写例子赋贴上来。
一、角度分析:
变量作用域 -------> 局部变量和全局变量
变量存在的生存期 ---------> 静态存储方式和动态存储方式
二、局部变量:
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开函数后再使用这种变量是非法的。
例子:
关于局部变量的作用域还要说明以下几点:
1)主函数也是一个函数,它与其他函数是平行关系。主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。
2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3)在不同函数中可以使用相同的变量名,它们代表不同的对象,编译器分配不同的单元,互不干扰。
4)在复合语句中定义的变量其作用域只能在复合语句范围内。
例子:
三、全局变量
全局变量也称为外部变量,是在函数外语定义的变量。它不属于哪一个函数,它属于一个源程序文件(所以只要是在同一个源程序文件,那么就可以利用这个变量进行赋值或其他操作)。其作用域是整个源程序(如何理解这里的“源程序”)。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明附为:extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
例如:
三、变量的存储方式
用户存储空间可以分为三个部分:
程序区 | |
静态存储区(在程序运行期间分配固定的存取空间的方式。) | |
动态存储区(在程序运行期间根据需要进行动态的分配存储空间的方式。) |
动态存储区存放一下数据:
1)函数形式参数;
2)自动变量(未加static声明的局部变量);
3)函数调用实的现场保护和返回地址;
对以上这些数据,在函数开始调用时分配动态存续空间,函数结束时释放这些空间。
在c语言中,每个变量和函数有两个属性:数据类型和数据存储类别。
1、auto变量:
函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数
据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变
量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释
放这些存储空间。这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明。
例如:
int f(int a) /*定义 f 函数,a 为参数*/
{auto int b,c=3; /*定义 b,c 自动变量*/
……
}
a 是形参,b,c 是自动变量,对 c 赋初值 3。执行完 f 函数后,自动释放 a,b,c 所占
的存储单元。
关键字 auto 可以省略,auto 不写则隐含定为“自动存储类别”,属于动态存储方式。
2、用static声明局部变量
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。
例如:
f(int a)
{
auto b=0;
static c=3;
b=b+1;
c=c+1;
return(a+b+c);
}
main()
{
int a=2, i;
for(i=0;i<3;i++)
printf("%d",f(a));
对静态局部变量的说明:
1)静态局部变量数据静态存储类别,在静态存储区分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
2)静态局部变量在编译时赋初始值,即只赋初始值一次;而对自动变量赋初始值是在函数调用进行,没调用一次函数重新给一次初值,相当于执行一次赋值语句。
3)如果在定义局部变量时不赋初始值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定值。
例如:
3、用extern声明外部变量
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限与定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量做“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
}
额外链接:
1、全局变量与局部变量在内存中的区别详细解析 http://www.ogeek.net/article/42012.htm
-----------------
Hayder
2015-4-26