C语言中的变量,可以按作用域和作用时间(即生存期)来分类
1.按作用域可分为局部变量和全局变量
2.按作用时间可分为静态储存方式和动态储存方式
变量作用域分类
1.局部变量(内部变量):在函数中定义或说明的变量。
作用域:仅限于函数内,从变量的定义点到这个函数结束为止
如在函数f1范围内a,b,c有效,或者说a,b,c变量的作用域限定于f1内
int f1(int a) //函数f1
{
int b,c;
…
}
说明
1:主函数中定义的变量只能在主函数中使用,不能再其他函数中使用。同时,在主函数中不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。
2:形参变量是被调函数的局部变量,实参变量是属于主调函数的局部变量
3:允许在不同的函数中使用相同的变量名。
4:在复合语句中也可以定义变量,其作用域只在复合语句范围内。
int main() \\6-10行为b的作用域,3-12行为s和a的作用域
{
int s, a;
……
{
int b;
s = a + b;
…
}
…
}
- #incude <stdio.h>
- int main()
- {
- int i = 3, j = 4, k; //这个k不作用于8,9行
- k = i*j;
- {
- int k = 78; //这个k屏蔽main中的k,只作用于8行和9行
- printf("%d\n",k);
- }
- printf("%d %d\n",i,k);
- }
2.全局变量(外部变量):在函数外面定义的变量
作用域:变量定义点开始到整个源程序的结束。
说明
1:全局变量必须定义在所有函数之外。
定义格式:extern 类型说明符 变量名,变量名,…;
2:在函数内使用全局变量要声明,且不能再赋初始值,只是表明在函数内要使用某外部变量。
说明形式:extern 类型说明符 变量名,变量名…;
3:如果全局变量与局部变量同名,则在局部变量作用域内,外部变量被“屏蔽”,不起作用
#include <stdio.h>
int vs(int l,int w)
{
extern int h; //说明外部变量h在函数vs()中可用
h = 6;
int v;
v = l * w * h;
return v;
}
int main()
{
extern int w, h; //说明外部变量w和h在函数main()中可用
int l = 5; //此处定义了局部变量,以屏蔽外部变量l
printf("v = %d",vs(l, w));
}
int l = 3, w = 4, h = 5; //定义外部变量并赋初值
变量存储方式分类
静态变量概念:如果在函数内定义了一个静态变量,当这个函数被调用结束时,这个变量不会随着函数结束而结束,当再次被调用时,该变量时的值还是上一个函数结束时的值。
动态变量概念:刚好与静态变量相反,当在函数内定义了一个动态变量,当这个函数被调用结束时,这个变量也就不存在了。它的周期是从建立到函数结束,而不是程序结束。
2.寄存器变量:register 类型说明符 变量名,变量名,…;,这种变量存放在cpu寄存器中,使用时,不需要访问内存,直接从寄存器中读写,可以提高效率。只有局部自动变量和形式参数才可以定义为寄存器变量。
3.静态变量
a.静态局部变量:static 类型说明符 变量名,变量名,…; 属于静态存储方式。
说明:- 其生存周期为从定义开始到源程序结束;
- 它只能在其定义的函数内使用,尽管退出该函数后它还存在,但是不能在其他函数内使用它;
- 静态局部变量只在编译时赋初值一次,再次调用不执行初始赋值语句;
- 对静态局部变量而言,如果未赋初值,则系统自动赋0值。
b.静态全局变量:static extern 类型说明符 变量名,变量名,…; 属于静态存储方式。
说明: - 全局变量和静态全局变量都是静态存储方式,那么它们有什么不同呢?
- 全局变量可以在多个源文件中使用,不同之处在于,加了static之后,限制了全局变量的使用范围,使之只能在定义该变量的源文件中使用。
4.外部变量(全局变量):前面已经介绍过了,在这里再补充几点:
- 全局变量是从它的作用域提出的,外部变量是从它的存储方式提出的。
- 当一个源程序有若干个源文件组成,其中一个源文件中定义的外部变量可以在其他源文件中使用。