一、变量的作用域(空间)
1、代码块作用域
在{}里面属于一个代码块,如下i1,i2互不影响
{
i = 1;//i1
{
i=2;//i2
}
}
2、文件作用域
任何在代码块之外的声明,从声明到文件结束都可访问,函数也具有文件作用域。
int i;
int main()
{
}
3、原型作用域
函数定义时,只在定义起作用
void func(int array[],int length);
4、函数作用域
适用于goto语句,只能在函数内部跳转
二、变量的生存期(时间)
静态储存期(static storage duration)
1、具有文件作用域的变量属于静态存储期,这个变量会一直保存直到程序结束才释放。函数也是文件作用域。
2、如果用static修饰局部变量,其作用域还是局部,但是其值会一直保存到程序结束。
自动存储期(automatic storage duration)
1、具有代码块作用域的变量一般属于自动存储期,这个变量在代码块结束是自动释放。代码块就是{}包含的代码。
·自动变量auto
auto int i;
·寄存器变量register:
register int i;
可能被存放于CPU的寄存器中,跟自动变量差不多,具有代码块作用域,自动存储期,和空连接属性,但无法用&取值运算符获得地址。
·静态局部变量static
static int i;
这样定义之后,这个变量直到程序结束才释放,但仍只在代码块内访问。
·extern
extern int i;
意思是告诉编译器这个变量别的地方定义了,别报错。
文件链接属性
1、C语言多文件编译时会考虑到链接属性
一般函数、全局变量具有external属性,能在其他文件访问,在其他文件访问时要加extern关键字;internal属性实在本文件可以访问,其他文件不可访问,使用static关键字可以把具有external属性的标识符改为internal属性,不可改回来,并且只对文件作用域的标识符生效。