存储类别,链接,内存管理

作用域:

  块作用域~是一对花括号括起来的区域,可见范围是从定义开始到快结尾,整个函数体也是一个块,虽然函数的形式参数在函数的左花括号前,但是属于函数体这个块,以前具有块作用域的必须声明快的开头,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

posted @ 2019-02-25 21:03  HJblogs  阅读(174)  评论(0编辑  收藏  举报