变量的作用域
文件作用域
在所有函数的开头定义变量,变量具有文件作用域,称为全局变量。全局变量的值在函数执行中一直有效。例如1.c文件中的变量a为全局变量。
1.c
#include<stdio.h>
int f1
int a=10;
int main()
{
f1(a);
return;
}
int f1(int x)
{
for(int i=0;i<10;i++)
{
x+=x;
}
return x;
}
函数作用域
在函数开头定义的变量,变量具有函数作用域,称为局部变量。局部变量的值只在本函数中起作用。例如1.c中的变量x具有函数作用域。
代码块作用域
在函数内的复合语句中定义的变量,变量具有代码块作用域,也称为局部变量。此变量的值只在代码块中起作用(也就是说只在一个{}里起作用)。例如1.c中的变量i具有代码块作用域,只在for循环中有效。
变量存储类型
C语言中变量按照存储时期划分,分为两种类型。一是自动存储变量(auto),二是静态存储变量(static)。
自动存储变量(auto)
当进入变量的作用域之后就会自动的为变量分配内存,当退出变量的作用域后变量使用的内存就会自动释放。自动变量所使用的内存区域可以重复使用,当函数调结束后当前变量使用的内存又可以被下一个变量使用。
静态存储类型(static)
变量为静态存储时期,在程序执行期间变量会一直存在,不会被释放。也就是说静态变量在函数调用中所获得的值会一直被程序记住。因此全局变量作用域在整个文件,只要程序运行全局变量就一直存在,所以全局变量就一定是静态变量。
变量链接
变量的链接分为内部链接、外部链接、空链接。
空链接
也就是说这个变量不能被作用域之外的任何地方引用,这也是私有变量。所以说具有函数作用域以及代码块作用域的变量都是空链接。
外部链接和内部链接
具有文件作用域的变量,也就是全局变量可以为外部链接也可以为内部链接。外部链接也就是说全局变量不仅可以在1.c源文件中使用,也可以在2.c源文件中使用。但是前提是要用extern关键词声明。
2.c
#include<stdio.h>
extern int a;
当我们在2.c中声明后就可以使用了。
如果变量是内部链接,意思就是只可以在1.c文件中使用,但是要在1.c文件中定义变量时要声明。
1.c
#include<stdio.h>
static int a;
定义变量时前面加上staic变量就是内部链接,即是在2.c中用extern声明也是无效的。