1.作用域描述程序中可访问标识符的区域。一个c变量的作用域可以是块作用域(是用一对花括号括起来的代码区域),函数作用域(仅用于goto语句的标签),函数原型作用域(用于函数原型中的形参名)或文件作用域(该文件作用域变量也叫全局变量)
2.c变量有3种链接属性:外部链接,内部链接或无连接。具有块作用域,函数作用域或函数原型作用域的变量都是无链接变量。具有文件作用域的变量都是外部或内部链接。(通常把内部链接的文件作用域简称为“文件作用域”,把外部链接的文件作用域简称为“全局作用域”,或“程序作用域”。
int ret=5;//文件作用域,外部链接
static reu=8;//文件作用域,内部链接
该文件和同一程序的其它文件都可使用变量ret。但变量reu属于文件私有,(其它文件只能间接使用)在该文件中任意函数可以使用reu。
3.作用域和链接描述了标识符的可见性,储存期描述了通过这些标识符访问的对象的生存期。c语言有4种储存期:静态储存期,线程储存期,自动储存期,动态分配存储期。
静态储存期:若对象具有静态储存期,它在程序执行时一直存在。(static表明了链接属性,不是储存期)列如static修饰的文件作用域变量具有内部链接,但无论内部链接和外部链接,文件作用域变量都具有静态存储期。也可以说改变了其生命周期,但未改变其作用域
线程存储期:用于并发程序设计,程序执行可被分为多个线程。具有线程存储期的对象,从被声明到线程结束一直存在。
自动存储期:属于自动存储的类别的变量具有自动存储期,且具有块作用域,无链接。
#include<stdio.h>
int main()
{
int x=10;//原始的x
int j=0;
for(i=0;i<4:i++)
{
int x=8;//新的x,隐藏了原来的x
printf("%d\n",x+i);
}
while(x>5)//原始的x
{
x--;
}
printf("%d",x);
return 0
}
块作用域的静态变量
#include<stdio.h>
void list();
int main()
{
int count 0;
for(count=0;count<=4;count++)
{
printf("%d",count);
}
list();
return 0;
}
void list()
{
int j=0;
static int k=1;
j++;
k++;
printf("%d %d",j,k); //j每次都为1,static保存了k的值,会增加
}
extern:不能创建外部的定义,只能引用现有的外部定义
extern int w;//引用式声明,外部链接
static int h=0;//静态定义,内部链接
int count=0;//文件作用域,外部链接
int main()
{ int i=0;//自动变量(局部变量)
register int k;//寄存器变量
static int u=0;//静态,无链接
return 0;
}