存储类别,链接,内存管理
作用域:
块作用域~是一对花括号括起来的区域,可见范围是从定义开始到快结尾,整个函数体也是一个块,虽然函数的形式参数在函数的左花括号前,但是属于函数体这个块,以前具有块作用域的必须声明快的开头,int x; for(x;;){} // c99之前,c99放宽限制推荐这样写 for(int x ; ;)对于for while do while if 语句所控制的代码,即使这些代码没用括号括起来,也算是块的一部分
函数作用域~仅用于goto语句,如果标签首次出现在函数体的内部,它的作用域也延伸整个函数。
函数原型作用域~从形参定义到形参定义结束。
文件作用域~定义在函数的外面,从定义开始到文件末尾都可以使用
链接:
具有块作用域,函数作用域,或是函数原型作用域的变量都是无链接变量;
外部链接可以在多个翻译单元中使用,内部链接只能在一个翻译单元(一个源文件代码和它所包含的头文件)使用,定义文件作用域默认为外部链接,static int x=1; 为内部链接,int x 内部链接
存储期:
作用域和链接描述了标识符的可见性。 存储期描述了通过这些标识符访问的对象的生存期静态存储期:
文件作用域 变量具有静态存储期 , 程序执行的过程都存在
线性存储期用于并发程序设设计,程序执行分为多个线程具有线性存储期的对象从被声明,到线性结束一直存在
块作用域具有自动存储期 当程序进入块时,分配内存,退出时释放刚才变量分配的内存然而块区域变量也有静态存储区, 变量前面加入static 关键字
属于自动存储类别的变量具有自动存储期 块作用域,且无连接 默认情况下 声明再块或者函数头中的任何变量都属于 自动存储类别 (为了有意覆盖一个外部变量 ,或者强调不要把该变量改为其他存储类别
) 可以显示使用auto 关键词。auto 关键词和c++不同 如果编写c和c++兼容的程序最好不要使用。
块作用域的静态变量:
程序在所离开的块之后,该变量不会被销毁。可以用指针访问。并且默认初始化为零,不能在函数的形参使用static
外部链接的静态变量:
int m=1// 1.cpp;
extern int m int main(){}//2.cpp 如果m定义在另一个文件中必须声明这样使用
还有一种情况
#include<stdio.h>//1.cpp extern int m; void showm() { extern int m;//可加可不加 printf("%d ", m); } int main() { int m = 10; printf("%d", m); showm(); } int m = 1;//2.cpp
内部静链接的静态变量:
#include<stdio.h> int c = 1; void showm() { extern int c; //表明使用的是 全局变量c printf("%d ",c); } int main() { //extern int c 会显示重复定义 int c = 10; printf("%d", c); showm(); }
int tern=1;//被定义 ,定义式声明只能初始化一次。
main()
{ extern int tern //使用别处定义的 tern 引用式声明,指示编译器去别处查找定义。即extern int tern=1 错误
寄存器变量 register int quick ;通常使用在循环中,块作用域,自动存储期,无连接。 void macho (register int m)
C99 Standard