变量的分类
对于变量的分类从不同的角度有不同的结果
从变量的作用域来看:
- 局部变量
- 全局变量
从变量的存储方式来看
- 静态存储方式
- 动态存储方式
全局变量
显而易见,作用域是全局的,其作用域为从定义的位置到整个源文件结尾,通常来说,在函数外部声明变量即为全局变量。
如果我们想在函数内部声明一个全局变量,需要时用关键字 global 即可。
对于全局变量又可以进一步的区分:
静态外部全局变量:
由于可能在某一个源文件中将全局变量的定义放在了需要使用该全局变量的函数前,所以我们需要将该变量的作用域扩展到该函数处
#include <stdio.h>
int main()
{
int max (int a );
extern int A,B; //扩展全局变量 A,B 作用域
printf ("Please input namber !!");
scanf ("%d %d",&A ,&B);
int a = max();
printf("The max is %d",a);
return 0;
}
int A,B; //此处全局变量定义在 main () 函数后,需要使用 extern 关键字扩展作用域
int max ()
{
if (A>B)
return A;
else
return B;
}
外部全局变量:
另一种可能为该全局变量想要扩展到其它源文件中使用,我们只需要在该文件全局变量声明前加上关键字 extern 即可。若想将源文件中的全局变量作用域限制在本文件中,则只需在变量前加上关键字 static 即可。
//file_1.c
#include <stdio.h>
extern int A ; //此处即为将其它文件中的全局变量 A 的作用域扩展到 file_1.c 文件中
//file_2.c
#include <stdio.h>
static int A ; //此处即为将 file_2.c 中的全局变量 A 的作用限制在 file_2.c 中。
在一个函数出现与全局变量名字相同的局部变量时,全局变量会被屏蔽,即默认访问局部变量。
局部变量
局部变量可以看作是存在函数内部的变量,作用域为函数内部。
我们可以根据其存储方式进一步分类:
自动局部变量:
对于函数中没有专门使用关键字声明的变量默认使用存储方式为自动 (auto) 的变量,这种存储类型的变量作用域为函数内部,且函数一旦运行完毕,变量的存储空间被释放,只用在下一次重新调用函数时才有可以被重新声明,重新赋予一次值。
#include <stdio.h>
int main ()
{
auto int a ; //表示在 main() 函数中的局部自动变量
int b; //与上面一样,表示一个局部自动变量
}
静态局部变量:
此时 的局部变量存储在静态存储区,作用域依旧是局部的(函数内),即使函数运行结束,该变量的值仍会保留,下次再调用时,若用到这个变量,其值仍是上次函数结束时变量的值。其定义方法为:使用关键字 static 。
#include <stdio.h>
void add()
{
static int a = 3;
int b = 1;
a = a + b;
printf("%d %d"a, b);
}
int main()
{
add(); //输出为 4 1
add(); //输出为 5 1
}
对于函数也有类似的性质,在函数名前加上关键字 static 则该函数只能用于该源文件内,若在另一文件中使用关键字 extern 声明其为其它文件声明的外部函数。