C语言总结:变量
1. 按作用范围
局部变量与全局变量。
局部变量:在函数内部(包括形参)定义,只在所定义的函数内部或者局部复合语句中有效。
全局变量:在函数外部定义,作用范围为从定义位置开始到所在源文件结束位置。习惯上,全局变量首字母常为大写。
#include<stdio.h>
int Max, Min; //全局变量
void fun1(){
int x , arr[10]; //局部变量
...
}
int A = 4, B = 5; //全局变量,作用范围为从当前位置到源文件结束处。
void fun2(int a){
...
}
注:函数内部的局部变量若和全局变量同名,全局变量会被局部变量“屏蔽”。
全局变量作用范围的扩展 — extern
如上面代码块中的全局变量A,B, 函数fun1内部无法引用它,因为A,B是在fun1之后定义的,为了将A,B的适用范围扩展到fun1中,可以在fun1内部用extern进行申明。
#include<stdio.h>
int Max, Min; //全局变量
void fun1(){
int x , arr[10]; //局部变量
extern int A, B; //类型int可省 <=> extern A, B;
printf("%d, %d", A, B);
...
}
int A = 4, B = 5; //全局变量,作用范围为从当前位置到源文件结束处。
void fun2(int a){
...
}
另外,extern也可以将全局变量的作用范围扩展到其他源文件中,只需要在其他文件中使用extern申明即可(文件放在同一路径下)。
但如果不希望本源文件中的外部变量(全局变量)被其他文件引用,可以在定义时用static申明,即使该外部变量只能为本文件所用。
file1.c
static int A;
....
file2.c
extern int A; //无法引用file1中的变量A;
...
2. 按存储类别
动态存储和静态存储。
动态存储:在程序运行期间随着函数的调用和返回,根据需要动态分配(释放)内存。比如,函数形参,函数内的自动变量(局部变量),函数调用时的现场保护和返回地址。
静态存储:在程序运行期间由系统分配固定的存储单元,在程序结束后才会释放。比如,全局变量,static声明的局部变量。
2.1 动态存储类别
- auto 变量
void fun(){
auto int a , b = 3;
// <=>
int a, b = 3; //auto可省
}
自动变量在函数调用时赋初值。
2.2 静态存储类别
- 全局变量
- static声明的局部变量
void fun(){
static int a = 3; //函数调用结束不会释放a的内存,可将上次调用后a的值运用到下次调用。
}
静态局部变量在编译时赋初值,且不可被其他函数所引用。