对象:存储数据的一块内存称为对象,用存储期描述对象
标识符:是一个名称,用来指定特定对象的内容.可以用作用域、链接来描述标识符
不同的存储类别具有不同的存储期、作用域和链接
存储期:指对象在内存中保留了多长时间
作用域和链接:描述程序的那些部分可以使用它
作用域
- 块作用域:(块是一对花括号括起来的代码区域 )从定义处到包含该定义的块的末尾
- 函数作用域:仅用于goto语句的标签。即使一个标签首次出现在函数的内层块中, 作用域延伸至整个函数
- 函数原型作用域:用于函数原型中的形参名(变量名),从形参定义到原型声明结束
- 文件作用域(文件作用域变量也称全局变量) :变量的定义在函数的外面,从它定义处到该定义所在文件的 结尾
链接
- 外部链接:外部链接变量可以在多文件程序中使用
- 内部链接:只能在一个翻译单元中使用
- 无链接:具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量。这意味着这些变量属于定义它们的块、函数或原型私有。
内部链接的文件作用域:描述一个仅限于一个翻译单元(一个源文件代码和它所包含的头文件)的作用域:简称文件作用域
外部链接的文件作用域:描述可延伸到其他翻译单元的作用域 :简称全局作用域或程序作用域
int count=3; //文件作用域,外部链接
static int tmp=2; //文件作用域,内部链接
存储期
静态存储期:程序的执行期间一直存在。文件作用域变量具有静态存储期。
线程存储期:用于并发程序设计,程序执行可被分为多个线程。具有线程
存储期的对象,从被声明时到线程结束一直存在。以关键字_Thread_local声
明一个对象时,每个线程都获得该变量的私有备份。
自动存储期:当程序进入定义这些变量的块
时,为这些变量分配内存;当退出这个块时,释放刚才为变量分配的内存。
动态分配存储期:通过malloc,calloc等方式分配的内存,通过调用free()等方法释放
存储类别
/*自动变量:具有自动存储期、块作用域、无链接、
为了更清楚的表达你的意图(为了表明有意覆盖一个外部变量定义,或者强调不要把该变量改为其
他存储类别),可以显示使用关键字auto
*/
/*外部存储类别:外部变量:具有静态存储区、文件作用域、外部链接
外部变量的作用域:从声明处到文件结尾,程序运行中一直存在
*/
int Errupt; //外部定义的变量
double Up[100]; //外部定义的数组
extern char Coal; //如果Coal被定义在另一个文件,则必须这样声明
void next(void);
//初始化外部变量:如果没有初始化,会被自动初始化为0
int x=10;
int y=3+10;
int x2=2*x;
int main(void)
{
extern int Errupt; //为了指出该函数使用了外部变量 ,可选的声明
extern double Up[]; //可选的声明,不用指明数组大小,
}
/*
#include<stdio.h>
extern int units; //外部变量
int a=0; //定义式声明,系统为变量a创建了存储空间
extern int a; //引用式声明,关键字extern 表明该声明不是定义,指示编译器去别处查询其定义
void critic(void);
int main(void)
{
extern int units; //可选的引用性声明
printf("%d\n",units);
printf("*****\n");
scanf("%d",&units);
while(units!=56)
critic();
printf("*****\n");
return 0;
}
void critic(void)
{
printf("很不幸,在试试!\n");
scanf("%d",&units);
}
*/
/* 外部静态变量 */
static int svil=1; //静态变量,内部链接
int traveler=1; //外部链接
static int stayhome=1; //内部链接
int main()
{
extern int traveler; //引用式声明,指示编译器去别处查询其定义
extern int stayhome; //使用定义在别处的stayhome,
}